Как принудительно выполнить 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