在responseHTML中执行JavaScript

时间:2010-06-28 00:01:00

标签: javascript ajax xmlhttprequest

当使用带有XHR的responseHTML时,Firefox会在加载的responseHTML中执行javascripts,而chrome则不会。如果我添加一个将解析并执行脚本的脚本,它将对chrome起作用,但它们会在Firefox中执行两次。知道如何知道浏览器是否会执行加载的脚本,而不是通过代理嗅探? PS:我使用的是不是jQuery或Prototype或其他任何东西的JS框架

3 个答案:

答案 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中测试过。