我们正在使用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";  
            }
        }
    );
}

但是,我偶尔需要在HTML响应中执行Javascript,并且此方法似乎无法执行此操作。

我正在尝试将Ajax调用的函数列表保持在最低限度,原因有很多,所以如果有一种方法可以修改现有函数而不会破坏当前正在使用的任何地方或修改HTML响应将导致任何嵌入式javascript执行,这很棒。

值得注意的是,我已经尝试添加“evalJS:'force'"该功能可以看到它会做什么,而且对任何事都没有帮助。

有帮助吗?

解决方案

参数是:

evalScripts:true

请注意,您应该使用 Ajax.Updater ,而不是 Ajax.Request

请参阅: http://www.prototypejs.org/api/ajax/updater

如果响应头是:

,Ajax.Request只会处理JavaScript
  

应用/ ECMAScript中,   应用程序/ JavaScript的,   应用程序/ x-的ECMAScript,   应用程序/ x-的JavaScript,   text / ecmascript,text / javascript,   text / x-ecmascript,或   文本/ X-JavaScript的

而Ajax.Updater将处理JS是evalScripts:设置为true。 Ajax.Request适用于数据传输,例如获取JSON响应。

由于您正在更新HTML,因此无论如何都应该使用Ajax.Updater。

其他提示

evalScripts:true 设置为选项有帮助吗?

你应该可以这样做:

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

如果你需要在注入HTML的同时执行某些操作,可以通过传递另一个参数来修改ajaxModify()的签名,这将是你要执行的javascript函数(如果它不是null - 让你保持可选,因为你肯定不想在每个AJAX响应上执行某些事情。)

只需在ajax响应后执行自定义my_function()

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

然后执行自定义my_function()

中的任何函数
function my_function() {
  function_1()
  ...
}

请注意,my_function()应该位于div.innerHTML之外的某个位置。

你需要使用eval()函数在Ajax中运行javascript 这可以使用full来分离脚本并运行它

 

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top