Как заставить Javascript выполняться в ответе HTML на запрос Ajax - PullRequest
11 голосов
/ 10 ноября 2008

Мы используем 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" "к функции, чтобы посмотреть, что она будет делать, и это ничего не поможет.

Ответы [ 5 ]

17 голосов
/ 10 ноября 2008

Параметр:

evalScripts:true

Обратите внимание, что вы должны использовать Ajax.Updater , а не Ajax.Request

См .: http://www.prototypejs.org/api/ajax/updater

Ajax.Request будет обрабатывать JavaScript, только если заголовки ответа:

применение / ECMAScript, приложение / JavaScript, применение / х-ECMAScript, применение / х-JavaScript, текст / экмаскрипт, текст / джаваскрипт, text / x-ecmascript или текст / х-Javascript

Принимая во внимание, что Ajax.Updater будет обрабатывать JS как evalScripts: установлено значение true. Ajax.Request ориентирован на передачу данных, например получение ответа JSON.

Поскольку вы обновляете HTML, вам все равно следует использовать Ajax.Updater.

1 голос
/ 10 ноября 2008

Помогает ли настройка evalScripts: true в качестве опции?

0 голосов
/ 23 декабря 2010

вам нужно использовать функцию eval () для запуска JavaScript в Ajax repose это можно использовать полностью, чтобы отделить скрипт и запустить его

 

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

0 голосов
/ 18 января 2010

Просто выполните пользовательскую функцию my_function () после ответа ajax

div.innerHTML=...ajax response text...
my_function()

затем выполните любую функцию внутри пользовательской функции my_function ()

function my_function() {
  function_1()
  ...
}

Обратите внимание, что my_function () должна находиться где-то за пределами div.innerHTML.

0 голосов
/ 10 ноября 2008

Вы должны быть в состоянии сделать что-то вроде этого:

div.innerHTML = "<div onclick='someOtherFunctionTocall();'>";

Если вам нужно выполнить что-то одновременно с внедрением HTML, вы можете изменить сигнатуру ajaxModify (), передав другой параметр, который будет функцией javascript, которую вы собираетесь выполнить (если она не равна нулю - что позволит вам оставить его необязательным, поскольку вы наверняка не захотите выполнять что-либо в ответе на КАЖДЫЙ AJAX).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...