Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 10.06.2013, 14:22
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от zebra
Почему бы просто не переопределить функцию someFunc?
+

а все остальное ненужые финты ушами

function foo() {
	alert( 1 );
}

function foo() {
	alert( 2 );
}      

foo();
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #12 (permalink)  
Старый 11.06.2013, 06:10
Аватар для cmd
cmd cmd вне форума
Профессор
Отправить личное сообщение для cmd Посмотреть профиль Найти все сообщения от cmd
 
Регистрация: 19.03.2011
Сообщений: 177

vadim5june, спасибо, буду разбираться. Не могу пока сказать работает или нет решение. В реальных условиях оно пока ведет себя немного не так как хотелось бы. Проблема в том, что success содержит функцию, а строка не может содержать функцию (я поэтому и пытался сделать через объект). Впрочем, думаю разберусь... В любом случае, большое спасибо за помощь и уроки JS - почерпнул для себя новой информации

nerv_, представьте, что Вы пишите маленький модуль для большого программного продукта, который регулярно обновляется. И представьте, что функция в которой я хочу изменить 3-4 строки на самом деле состоит из 30-40 строк. Если скопировать всю функцию и переопределить её, то с большой долей возникнет проблема обратной совместимости с новыми версиями.

Выложу "конечный" результат - может кому-то будет интересно.
<!DOCTYPE html>
<head>
<script 
src="http://code.jquery.com/jquery-1.9.1.js"> 
</script>
</head>
<body>
<script>
function someFunc(somevar) {
	somevar = typeof(somevar) != 'undefined' ? somevar : 100;
$.ajax({
		url: 'index.php',
		type: 'post',
		data: 'somevar=' + somevar,
		dataType: 'json',
		success: function(json) {
				}
	});
};

var somevar='somevar';
	
	var str 		= someFunc.toString();
	var str0		= str.split('$.ajax(')[0];
	var stre		= ')';
	var parameters 	= 'var pars=' + str.split('$.ajax(')[1].split('})')[0] + '}'; eval(parameters);
	
	var paramsArray = {};
		for (var u in pars) {
			if (u && pars && u) {
				if (u == 'dataType') {
				
				} 
				else if (u == 'success') {
					paramsArray[u]	= "function() { alert('success!'); }";
				} 
				else if (u == 'url') {
					paramsArray[u]	= pars[u];
				} 
				else if (typeof pars[u] == 'function') { 
					paramsArray[u]	= pars[u].toString();
				} 
				else {
					paramsArray[u]	= pars[u];
				}
			}
		}
		paramsArray['error'] = "function(error) { console.log(error); }"
	
	var pp			= 'alert(100500); $.ajax(' + JSON.stringify(paramsArray) + stre;
	
	str = str.replace(/(\$\.ajax\(\{[\s\S]+\}\);)/gm, pp);

	
	eval(str);

	console.log( someFunc);
	someFunc();
</script>
</body>
</html>
__________________
Cogito, ergo sum

Последний раз редактировалось cmd, 11.06.2013 в 07:06.
Ответить с цитированием
  #13 (permalink)  
Старый 11.06.2013, 09:46
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Почему тогда не использовать ajaxSetup, ajaxComplete ?
Ответить с цитированием
  #14 (permalink)  
Старый 11.06.2013, 20:11
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от cmd
представьте, что Вы пишите маленький модуль для большого программного продукта
представь, что ты ломаешь инкапсуляцию, заложенную разработчиками продукта
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #15 (permalink)  
Старый 12.06.2013, 06:20
Аватар для cmd
cmd cmd вне форума
Профессор
Отправить личное сообщение для cmd Посмотреть профиль Найти все сообщения от cmd
 
Регистрация: 19.03.2011
Сообщений: 177

zebra, спасибо, вдохновился у Вас на
$(document).ajaxSend(function(evt, request, settings) {
  console.log("Ajax call on url " + settings.url); // url
  console.log(settings.success); // success function(), но к сожалению это только копия
});


nerv_, из двух зол выбираю. А разработчики в данном случае не "закладывали", а "клали".

UPD: Вот ещё интересное варварство.
__________________
Cogito, ergo sum

Последний раз редактировалось cmd, 12.06.2013 в 06:55.
Ответить с цитированием
  #16 (permalink)  
Старый 12.06.2013, 07:04
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от cmd
но к сожалению это только копия
В смысле? А разве функцию можно скопировать?
Ответить с цитированием
  #17 (permalink)  
Старый 12.06.2013, 08:46
Аватар для cmd
cmd cmd вне форума
Профессор
Отправить личное сообщение для cmd Посмотреть профиль Найти все сообщения от cmd
 
Регистрация: 19.03.2011
Сообщений: 177

danik.js, js не моя специализация и я мог неправильно выразиться, но:
$(document).ajaxSend(function(event, xhr, options){
    delete options.success;
    console.log(options.success);   // undefined
});
$.ajax({
    url: "test.html",
    success: function() { console.log("Как бы там ни было, а мы увидим этот текст"); }
});



Помощь по проблеме не нужна. Я воспользовался хаком, который привел в предыдущем посте. Всем большое спасибо за интересные комментарии и помощь.
__________________
Cogito, ergo sum
Ответить с цитированием
  #18 (permalink)  
Старый 12.06.2013, 11:16
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от cmd
js не моя специализация
теперь придется говорить, какая твоя специализация
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #19 (permalink)  
Старый 12.06.2013, 13:49
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от cmd
delete options.success
С чего ты взял что options - тот самый объект, который передали в $.ajax ?

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
$(document).ajaxSend(function(event, xhr, options){
    alert(options instanceof MyOptions);
    delete options.success;
    console.log(options.success);   // undefined
});

function MyOptions(options) {
    return options;
}
var myOptions = new MyOptions({
    url: "test.html",
    success: function() { console.log("Как бы там ни было, а мы увидим этот текст"); }
});
$.ajax(myOptions);
</script>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача функции с параметрами в функцию oli Общие вопросы Javascript 3 09.08.2012 13:52
как запустить функцию после другой функции Rentony jQuery 7 07.02.2012 18:01
как реализовать передачу функции в функцию?? czp Общие вопросы Javascript 10 29.11.2011 19:21
Передача значения из функции в функцию wine-time Общие вопросы Javascript 4 18.09.2011 17:39
Как привратить имя функции в саму функцию webmakaka Общие вопросы Javascript 2 15.09.2011 16:23