如何强制Javascript在对Ajax请求的HTML响应中执行
我们使用Prototype处理所有Ajax请求,为了保持简单,我们简单地呈现HTML内容,然后使用以下函数将其分配给适当的div:如何强制Javascript在对Ajax请求的HTML响应中执行,javascript,html,ajax,prototypejs,Javascript,Html,Ajax,Prototypejs,我们使用Prototype处理所有Ajax请求,为了保持简单,我们简单地呈现HTML内容,然后使用以下函数将其分配给适当的div: function ajaxModify(controller, parameters, div_id) { var div = $(div_id); var request = new Ajax.Request ( controller, { method: "post",
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
见:
如果响应头为:
应用程序/ecmascript,
应用程序/javascript,
应用程序/x-ecmascript,
application/x-javascript,
text/ecmascript,text/javascript,
text/x-ecmascript,或
text/x-javascript
而Ajax.Updater将处理JS is evalscript:true。Request面向数据传输,例如获取JSON响应
因为您正在更新HTML,所以无论如何都应该使用Ajax.Updater。您应该能够执行以下操作:
div.innerHTML = "<div onclick='someOtherFunctionTocall();'>";
div.innerHTML=“”;
如果您需要在注入HTML的同时执行某些内容,可以通过传递另一个参数来修改ajaxModify()的签名,该参数将是您要执行的javascript函数(如果它不是null,那么您可以将其保留为可选,因为您肯定不希望在每个AJAX响应上执行某些内容).是否将
evalscript:true设置为选项帮助?只需在ajax响应后执行自定义my_函数()
div.innerHTML=...ajax response text...
my_function()
然后执行自定义my_函数()中的任何函数
请注意,my_function()应该位于div.innerHTML之外。您需要使用eval()函数在Ajax REST中运行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;
}
函数PaseAjaxResponse(somemixedcode)
{
var source=somemixedcode;
var scripts=newarray();
while(source.indexOf(“这真是太糟糕了!我不敢相信我以前从未见过这种情况。谢谢你。我也是。我犯了同样的错误,花了一个小时把头撞在显示器上。这是因为我只是在吐JS,不在乎更新任何HTML。我最后更新了一个虚拟/隐藏的DIV,这样我就不必修改服务器头了。”。
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;
}