2011-05-10 69 views
1

我正在做一些正在做DOM樹行走的項目。爲了插入一些跨度標籤亮點添加到文檔中,有時需要拆分textnode:IE9中文本節點==「未知」的「nodeValue」屬性的類型

var newTextNode = treeWalker.currentNode.splitText(charOffset); 

問題是後來當我下一次嘗試撥打:

if (newTextNode.nodeValue == "") 
{ 
    //... 
} 

.nodeValue調用在IE9中產生一個JavaScript錯誤,簡單地說,Incorrect function.完全沒有幫助說至少。想到也許有些奇怪的事情發生了,我打開調試器並執行:typeof newTextNode.nodeValue,它返回"unknown"

有人能解釋這種行爲嗎?我想也許這個功能根本不適用於文本節點,但在其他場景下它可以正常工作。它只是在撥打splitText後才發現它似乎在嘔吐。

我感謝大家的幫助!我的Google-fu遠遠不夠。

此外:

看newTextNode對象之後,還有更多的屬性計算結果爲 「不正確的函數」

  • 數據
  • 長度
  • 的nodeValue
  • 的textContent
  • wholeText
+0

請參閱[如何檢索DOM文本節點的文本?](http://stackoverflow.com/questions/7690627/how-to-retrieve-the-text-of-a-dom-text-node ) – hippietrail 2012-09-05 17:50:07

回答

6

這是IE 9

一個bug什麼IE 9將返回顯然不是一個文本節點。現在我還不確定。當您撥打textNode.splitText(n)時發生這種情況,其中n等於文本節點中文本的長度。這並不在IE 7(無法測試8現在)和所有其他主流瀏覽器發生,是違背DOM 2 spec,其中指出,splitText()

將此節點拆分爲兩個節點指定的偏移量,保持在樹上作爲兄弟姐妹。分割後,該節點將包含所有內容直到偏移點。返回包含偏移點之後的所有內容的同一類型的新節點。如果原始節點具有父節點,則將新節點插入原始節點的下一個兄弟節點。當偏移量等於該節點的長度時,新節點沒有數據。

最簡單的解決辦法是增加一個檢查這種情況:

if (n < textNode.length) { 
    newTextNode = textNode.splitText(n); 
} 
+0

我很高興得到一些驗證,我不瘋狂。我會看看這裏發生了什麼,並嘗試你的建議!就在我頭頂,我不相信splitText'n'值實際上是節點中文本的長度,但我會驗證。謝謝您的幫助。 – 2011-05-10 15:50:48

0

IE8正常工作,如果你在它的長度值分割textnode返回一個空節點。 IE9正常工作,直到您嘗試分割數據的長度。

我希望IE9(或IE10)能夠正確使用,但是IE6有同樣的問題 - 只要它的長度不能在索引處分割一個文本節點。

如果您通過索引大於文本長度的,則其他瀏覽器也會失敗,因此您可以在分割之前檢查節點的data.length。

如果長度小於或等於要分割的索引,請將其保留並在其旁邊追加一個新的空節點。

IE9(及其他)返回一個空字符串作爲用空字符串創建的textnode的數據或nodeValue。

相關問題