2011-09-11 2 views
3

Internet Explorer 9では、テキストノードでsplitTextを呼び出すと、その親のchildNodesは更新されません。 ChromeとFirefoxでは、予想どおりhttps://developer.mozilla.org/En/DOM/Text.splitTextになります。 console.dirは、テキストノードの親に呼び出されたときにIE9:splitTextの後にchildNodesは更新されませんか?

しかし IE9は適切に動作しない

例(?):

<!DOCTYPE html> 
<html lang="en"> 

<meta charset="utf-8"> 

<script type="text/javascript" charset="utf-8"> 

window.onload = function() { 

    var e = document.querySelector('#test p'); 

    var f = e.childNodes[0].splitText(10); 

    console.log(e.childNodes.length) 

    // console.dir(e) 

    console.log(e.childNodes.length) 

} 

</script> 

<div id="test"> 
    <p>Senectus et netus et malesuada fames ac turpis egestas.</p> 
</div> 

</html> 

IE9出力:

LOG: 1 
LOG: 1 

ChromeとFirefoxの両方正しく出力:

console.dir(e)のコメントを解除し、IE9出力:

LOG: 1 
LOG: [object HTMLParagraphElement] {} 
LOG: 2 

は、これはバグですか?もしそうなら、console.dirのほかに、実際の状態を「リフレッシュ」して反映させるための回避策がありますか?childNodes?同様に、追加/ノードを削除された瞬間に動作するように見える何

更新

var t = document.createTextNode(""); 
e.appendChild(t); 
e.removeChild(t); 

答えて

1

あなたはsplitText()の代わりに回避策を使用することができます

function insertAfter(node, precedingNode) { 
    var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode; 
    if (nextNode) { 
     parent.insertBefore(node, nextNode); 
    } else { 
     parent.appendChild(node); 
    } 
    return node; 
} 

// Note that we cannot use splitText() because it is bugridden in IE 9. 
function splitDataNode(node, index) { 
    var newNode = node.cloneNode(false); 
    newNode.deleteData(0, index); 
    node.deleteData(index, node.length - index); 
    insertAfter(newNode, node); 
    return newNode; 
} 
+0

感謝。私はすでにパフォーマンスのペナルティがなく、うまく動作しているように思われる回避策を使用しています。 –

関連する問題