2012-09-01 35 views
3

我聽說使用el.innerText||el.textContent可以產生不可靠的交叉瀏覽結果,所以我正在步行DOM樹以遞歸方式收集文本節點,並將它們寫入HTML主體中的標籤。Element.appendChild()在IE中氾濫...解決方法? (與innerText vs textContent有關)

這個腳本是做什麼的,是從window.location中讀取hash substring valus,並將它們寫入HTML

此腳本適用於Chrome & Firefox,但在IE中窒息。

我所說的頁面的URL語法如下:

http://example.com/pagename.html#dyntext=FOO&dynterm=BAR&dynimage=FRED 

更新的版本?

解決方案:

</body>之前移動腳本(他們應該在那裏)然後刪除console.log(sPageURL);現在它'使用Chrome,Firefox,IE8和IE9的s

這是我對innerText vs textContent crossbrowser問題的解決方法,當您只是放置文本而不是獲取文本時。在這種情況下,從window.location獲取哈希子串值並將它們寫入頁面。

<html> 
<body> 

<span id="dyntext-span" style="font-weight: bold;"></span><br /> 
<span id="dynterm-span" style="font-style: italic;"></span><br /> 
<span id="dynimage-span" style="text-decoration: underline;"></span><br /> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script> 

<script> 
$(document).ready(function() { 
     var tags = ["dyntext", "dynterm", "dynimage"]; 
     for (var i = 0; i < tags.length; ++i) { 
      var param = GetURLParameter(tags[i]); 
      if (param) { 
       var dyntext = GetURLParameter('dyntext'); 
       var dynterm = GetURLParameter('dynterm'); 
       var dynimage = GetURLParameter('dynimage'); 
      } 
     } 

     var elem = document.getElementById("dyntext-span"); 
     var text = document.createTextNode(dyntext); 
     elem.appendChild(text); 
     var elem = document.getElementById("dynterm-span"); 
     var text = document.createTextNode(dynterm); 
     elem.appendChild(text); 
     var elem = document.getElementById("dynimage-span"); 
     var text = document.createTextNode(dynimage); 
     elem.appendChild(text);  
}); 

function GetURLParameter(sParam) { 
    var sPageURL = window.location.hash.substring(1); 
    var sURLVariables = sPageURL.split('&'); 
    for (var i = 0; i < sURLVariables.length; i++) { 
     var sParameterName = sURLVariables[i].split('='); 
     if (sParameterName[0] == sParam) { 
      return sParameterName[1]; 
     } 
    } 
} 

</script> 

</body> 
</html> 

最後更新

如果散列字符串值需要空間(如語言短語與三個單詞,例如),然後用在您的URI的+字符分隔的話,並在創建每個文本節點時用空格替換Unicode字符\u002B,如下所示:

var elem = document.getElementById("dyntext-span"); 
var text = document.createTextNode(dyntext.replace(/\u002B/g, " ")); 
elem.appendChild(text); 
var elem = document.getElementById("dynterm-span"); 
var text = document.createTextNode(dynterm.replace(/\u002B/g, " ")); 
elem.appendChild(text); 
var elem = document.getElementById("dynimage-span"); 
var text = document.createTextNode(dynimage.replace(/\u002B/g, " ")); 
elem.appendChild(text); 

現在,形成你的URI是這樣的:

http://example.com/pagename.html#dyntext=FOO+MAN+CHU&dynterm=BAR+HOPPING&dynimage=FRED+IS+DEAD 
+2

你可以更具體的「窒息IE」?什麼版本的IE? IE開發工具(F12)中的任何錯誤?此外,jQuery 1.8中的一個[已知問題](http://bugs.jquery.com/ticket/12282)是它可能在IE9/10中過早觸發DOM Ready處理程序。將腳本移動到''標記的末尾(他們應該在的位置)或者升級到jQuery 1.8.1,或者兩者都行(這更合適)。 –

+0

您需要列出您在IE中遇到的每個問題,因爲appendChild在IE中至少可以一直回到IE6。添加jQuery和一個不必要的複雜工作並不能幫助我們理解你最初做錯了什麼。 – austincheney

+0

忘記我的事先評論。您鏈接到的錯誤僅涉及「樣式」標籤,因此整個解決方法無效且不必要。 – austincheney

回答

0

有代碼console.log()時,必須有開發工具在IE中打開。還缺少head元素可能會導致一些問題。或者它只在這篇文章中丟失?

+0

Thanks @ fabricio-matte and @Teemu ...在''之前移動腳本,然後移除'console.log(sPageURL);'現在它在IE8和IE9中工作。謝謝大家。沒有你的幫助,我無法想象這一點。 –