2010-06-28 80 views
1

當在XHR中使用responseHTML時,Firefox在加載的responseHTML內執行javascripts,而鉻不會。如果我添加一個將解析和執行腳本的腳本,它將在鉻上工作,但它們會導致在Firefox中執行兩次。任何想法如何知道瀏覽器是否會執行加載的腳本或不是通過代理嗅探? PS:我使用的JS框架不是jQuery或原型或任何東西在響應中執行JavaScriptHTML

+0

好吧,我已經找到一種方法來做到這一點,但它有點難看,所以我離開了這個問題打開 – fabjoa 2010-06-28 01:20:41

回答

0

不要嗅。測試。我不記得Mozilla何時觸發腳本的機制,但應該可以製作一個內部測試,以檢測腳本是否被觸發,然後進行相應的修補。

+0

我一直在谷歌搜索過去幾個小時,沒有迴應。我有點眼花繚亂,似乎是一個非常重要的X瀏覽器問題,雖然 – fabjoa 2010-06-28 00:51:08

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; 
     } 
    }); 
} 

我測試過這個opera,firefox,chromium,safari。雖然沒有在IE6中測試過。

+0

謝謝你,我會調查它......也在IE6上讓你知道:) – fabjoa 2010-06-28 05:14:46

1

這是第n個時間,我現在回答這個問題:)

// 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" 
+0

thx肖恩,但那不是我的問題。如果我按照你的建議進行操作,腳本將在Chrome中執行一次,但在執行腳本的firefox中執行兩次。我已經找到了一種方法,將一個JavaScript預先添加到innerHTML中,它將告訴onload腳本執行與否。 – fabjoa 2010-07-03 11:06:10

+0

這不是事實。在將替換腳本插入DOM之前,替換腳本將被刪除,因此它只能在'eval'中執行。你真的嘗試過嗎? – 2010-07-03 12:25:37