当使用带有XHR的responseHTML时,Firefox会在加载的responseHTML中执行javascripts,而chrome则不会。如果我添加一个将解析并执行脚本的脚本,它将对chrome起作用,但它们会在Firefox中执行两次。知道如何知道浏览器是否会执行加载的脚本,而不是通过代理嗅探? PS:我使用的是不是jQuery或Prototype或其他任何东西的JS框架
答案 0 :(得分:1)
这是我现在第一次回答这个问题:)
// response is the data returned from the server
var response = "html\<script type=\"text/javascript\">alert(\"foo\");<\/script>html";
var reScript = /\<script.*?>(.*)<\/script>/mg;
response = response.replace(reScript, function(m,m1) {
eval(m1); //will run alert("foo");
return "";
});
alert(response); // will alert "htmlhtml"
答案 1 :(得分:0)
不要嗤之以鼻。测试。我不记得Mozilla何时触发脚本的机制,但应该可以制作一个内部测试来检测脚本是否被触发,然后进行相应的修补。
答案 2 :(得分:0)
不要使用responseHTML。请改用 responseText 并使用以下函数。 onSuccess功能对您很重要。在ajax请求的成功处理程序中使用它。
function showHtmlInElement(targetId, htmlUrl) {
var target = document.getElementById(targetId);
var Util = jaf.core.Util;
Util.ajax({
url: htmlUrl,
dataType: "text/html",
// ---------------------------------------------------------------
onSuccess: function(xhr) {
var responseText = xhr.responseText;
target.innerHTML = responseText;
// collect all the script tag content...
var scriptText = "";
var arrScripts = target.getElementsByTagName("script");
for(var i = 0, len = arrScripts.length; i < len; i++) {
var se = arrScripts[i];
scriptText += se.innerHTML;
}
if((scriptText = Util.trim(scriptText)).length != 0) {
eval.call(window, scriptText);
}
},
// ---------------------------------------------------------------
onError: function(xhr, code, message) {
var responseText = xhr.responseText;
var content = "<p class='error'>" + responseText + ": "
+ message + "(" + code + ")</p>";
target.innerHTML = content;
}
});
}
我测试了这部歌剧,火狐,铬,野生动物园。虽然没有在IE6中测试过。