[РЕШЕНО] Извлечь функцию из функции
Нет больше моих сил. Нужна помощь.
Дано функция: function someFunc(somevar) { somevar = typeof(somevar) != 'undefined' ? somevar : 100; $.ajax({ url: 'index.php', type: 'post', data: 'somevar=' + somevar, dataType: 'json', success: function(json) { // smth } } }); } Задача: получить функцию $.ajax как объект или строку для последующего внесения изменений. Дополнительное условие: нельзя редактировать первоначальную функцию. Я так понимаю, что единственный способ решить такую головоломку, это взять someFunc как строку и разбить регулярным выражением, отредактировать, а потом собрать обратно. Но у меня упорно не получается написать регулярку для извлечения $.ajax( .. ). Спсибо, что дочитали. Любые идеи приветствуется. |
Цитата:
var str="function someFunc(somevar) { " str=str+"somevar = typeof(somevar) != 'undefined' ? somevar : 100; " str=str+"$.ajax({ " str=str+"url: 'index.php', " str=str+"type: 'post', " str=str+"data: 'somevar=' + somevar, " str=str+"dataType: 'json', " str=str+"success: function(json) { " str=str+"// smth " str=str+"} " str=str+"} " str=str+"}); " str=str+"} " alert(str.replace(/(\$\.ajax\(\{[\s\S]+\}\);)/gm,'test')); |
1.Внутри ajax одна '}' -лишняя
2. function someFunc(somevar) { somevar = typeof(somevar) != 'undefined' ? somevar : 100; $.ajax({ url: 'index.php', type: 'post', data: 'somevar=' + somevar, dataType: 'json', success: function(json) { // smth //} } }); } var str=someFunc.toString(); alert('$.ajax'+str.split('$.ajax')[1].split('})')[0]+'})'); |
Спасибо, я со скобочками сам справился)
function someFunc(somevar) { somevar = typeof(somevar) != 'undefined' ? somevar : 100; $.ajax({ url: 'index.php', type: 'post', data: 'somevar=' + somevar, dataType: 'json', success: function(json) { // smth //} } }); } var addToCart_string = addToCart.toString(); addToCart_string = addToCart_string.match(/(\$\.ajax\(\{[\s\S]+\}\);)/gm); // теперь у меня есть строка с ajax запросом // который надо отредактировать // черещ new Function не получилось и через eval тоже // по ходу надо распарсить строку и получить параметры // а потом отъявить var myNewFunction = $.ajax(params); Вот тут я сейчас ломаю голову и ищу какой-то готовый инструмент для синтаксического анализа строки. |
function someFunc(somevar) { somevar = typeof(somevar) != 'undefined' ? somevar : 100; $.ajax({ url: 'index.php', type: 'post', data: 'somevar=' + somevar, dataType: 'json', success: function(json) { // smth //} } }); } var somevar='somevar'; var str=someFunc.toString(); var pp='var pars='+str.split('$.ajax(')[1].split('})')[0]+'}';eval(pp);for(var u in pars)alert(u+'='+pars[u]); |
Почему бы просто не переопределить функцию someFunc?
|
Цитата:
vadim5june, нетривиально и сыро, но буду разбираться. Спасибо большое. |
<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) { // smth //} } }); } var somevar='somevar'; var str=someFunc.toString(); var parameters = 'var pars='+str.split('$.ajax(')[1].split('})')[0]+'}'; eval(parameters); var paramsArray = {}; for (var u in pars) { if (u && pars && u) { paramsArray[u]=pars[u]; } } var my_ajax_funciton_now = $.ajax(someFunc); // это провал. зараза выполняет вместо того, чтобы присваивать. console.log(my_ajax_funciton_now ); </script> </body> </html> |
Цитата:
Грамматика JS там в примерах есть, а вот лексем вроде нету. Но найти можно если сильно захотеть. |
насколько я понимаю нужно изменить значения внутри ajax и переопределить функцию someFuns
тогда так <!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) { paramsArray[u]=pars[u];//здесь переопределяем значения } } ; pp=str0+'$.ajax('+JSON.stringify(paramsArray)+stre; eval(pp); console.log(someFunc.toString() ); </script> </body> </html> |
Цитата:
а все остальное ненужые финты ушами function foo() { alert( 1 ); } function foo() { alert( 2 ); } foo(); |
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> |
Почему тогда не использовать ajaxSetup, ajaxComplete ?
|
Цитата:
|
zebra, спасибо, вдохновился у Вас на
$(document).ajaxSend(function(evt, request, settings) { console.log("Ajax call on url " + settings.url); // url console.log(settings.success); // success function(), но к сожалению это только копия }); nerv_, из двух зол выбираю. А разработчики в данном случае не "закладывали", а "клали". UPD: Вот ещё интересное варварство. |
Цитата:
|
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("Как бы там ни было, а мы увидим этот текст"); } }); Помощь по проблеме не нужна. Я воспользовался хаком, который привел в предыдущем посте. Всем большое спасибо за интересные комментарии и помощь. |
Цитата:
|
Цитата:
<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> |
Часовой пояс GMT +3, время: 00:01. |