2013-12-17 49 views
0

在DOM操作後,我在Firefox中看到奇怪的行爲。更改TextNode的內容不會改變其屬性。例如。刪除一個字符不會更新textContent的長度。DOM操作後TextContent長度不會改變

下面是HTML

<p>Input:</p> 
<div> <span id="cursor"></span></div> 
<p>Results:</p> 
<ul id="result"></ul> 

和JavaScript

var cursor = document.getElementById("cursor"), 
    result = document.getElementById("result"); 

window.addEventListener('keydown', function(e) { 
    //Backspace event 
    if (e.which == 8) { 
    cursor.previousSibling.textContent = cursor.previousSibling.textContent.substring(0, cursor.previousSibling.textContent.length - 1); 
    } 
}, true); 

//Capture key press and write character to TextNode 
window.addEventListener('keypress', function(e) { 
    cursor.previousSibling.textContent = cursor.previousSibling.textContent + String.fromCharCode(e.which); 
}, true); 

測試此代碼在http://jsfiddle.net/dx7Dy/9/

在Chrome中它能正常工作,您鍵入的DIV充滿信。退格鍵刪除最後一個字符。

在Firefox中,第一個退格之後,最後一個字符被刪除,但TextNode的textContent長度未更新。

刪除TextNode(包括node.remove()parentNode.removeChild(節點))時,我已經看到了同樣的問題。它的內容被清空,但節點仍然在DOM中,所以下一個remove()只是試圖刪除同一個空節點,並將其留空並再次放置。

這隻發生在通過事件偵聽器觸發時。例如,如果我通過Firebug控制檯操縱DOM,則一切都按預期工作。

這是Firefox代碼中的錯誤嗎?

回答

0

代碼中的錯誤,在調整JSFiddle時發現它。兩位聽衆正在互動。

按下退格鍵時,Chrome不會觸發按鍵事件。 Firefox的確如此。

看到它在這裏發生http://jsfiddle.net/dx7Dy/11/我向兩個聽衆添加了日誌代碼。

result.insertAdjacentHTML("beforeend", "<li>"+cursor.previousSibling.textContent + " " + cursor.previousSibling.textContent.length + "</li>"); 
+2

你說得對。這是一個工作小提琴:http://jsfiddle.net/dx7Dy/13/ Pozdrav! – jeremija