Как принудительно выполнить Javascript для выполнения в ответ HTML на запрос Ajax
Мы используем Prototype для всей нашей обработки запросов Ajax и для упрощения простого простого отображения HTML-содержимого, которое затем назначается соответствующему div, используя следующую функцию:
function ajaxModify(controller, parameters, div_id)
{
var div = $(div_id);
var request = new Ajax.Request
(
controller,
{
method: "post",
parameters: parameters,
onSuccess: function(data) {
div.innerHTML = data.responseText;
},
onFailure: function() {
div.innerHTML = "Information Temporarily Unavailable";
}
}
);
}
Однако иногда мне нужно выполнить Javascript в ответе HTML, и этот метод кажется неспособным сделать это.
Я пытаюсь свести список функций для вызовов Ajax к минимуму по ряду причин, поэтому, если есть способ изменить существующую функцию, не нарушая везде, где она используется, или способ изменить HTML-ответ, который приведет к выполнению любого встроенного javascript.
В качестве примечания, я уже пытался добавить "evalJS:" force "к функции, чтобы увидеть, что она будет делать, и это ничего не помогло.
Ответы
Ответ 1
Параметр:
evalScripts:true
Обратите внимание, что вы должны использовать Ajax.Updater, а не Ajax.Request
Смотрите: http://www.prototypejs.org/api/ajax/updater
Ajax.Request обрабатывает только JavaScript, если заголовки ответа:
Приложение/ECMAScript, приложение /JavaScript, применение/х-ECMAScript, применение/х-JavaScript, text/ecmascript, text/javascript, text/x-ecmascript, или текст/х-Javascript
В то время как Ajax.Updater будет обрабатывать JS, это evalScripts: установлено значение true. Ajax.Request ориентирован на передачу данных, например, получение ответа JSON.
Поскольку вы обновляете HTML, вы должны использовать Ajax.Updater в любом случае.
Ответ 2
Помогает ли настройка evalScripts: true
в качестве опции?
Ответ 3
Вы должны сделать что-то вроде этого:
div.innerHTML = "<div onclick='someOtherFunctionTocall();'>";
Если вам нужно выполнить что-то одновременно с введением HTML-кода, вы можете изменить подпись ajaxModify(), передав другой параметр, который будет функцией javascript, которую вы собираетесь выполнить (если это не null - который позволит вам сохранить его необязательным, так как вы, конечно же, не захотите что-то выполнять при каждом ответе AJAX).
Ответ 4
Просто выполните пользовательскую функцию my_function() после ответа ajax
div.innerHTML=...ajax response text...
my_function()
затем выполните любую функцию внутри пользовательской функции my_function()
function my_function() {
function_1()
...
}
Обратите внимание, что my_function() должен находиться где-то вне div.innerHTML.
Ответ 5
вам нужно использовать функцию eval() для запуска javascript в режиме ожидания Ajax
это можно использовать полностью, чтобы отделить script и запустить его
function PaseAjaxResponse(somemixedcode)
{
var source = somemixedcode;
var scripts = new Array();
while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
var s = source.indexOf("<script");
var s_e = source.indexOf(">", s);
var e = source.indexOf("</script", s);
var e_e = source.indexOf(">", e);
scripts.push(source.substring(s_e+1, e));
source = source.substring(0, s) + source.substring(e_e+1);
}
for(var x=0; x<scripts.length; x++) {
try {
eval(scripts[x]);
}
catch(ex) {
}
}
return source;
}
аллитеративно для получения дополнительной информации см. это
http://www.yasha.co/Ajax/execute-javascript-on-Ajax-return/article-2.html