IE9: дочерние узлы не обновляются после splitText? - PullRequest
3 голосов
/ 11 сентября 2011

В Internet Explorer 9 вызов splitText в текстовом узле не обновляет childNodes его родителя.В Chrome и Firefox он работает, как и ожидалось для https://developer.mozilla.org/En/DOM/Text.splitText.

Однако IE9 работает правильно, когда console.dir вызывается у родительского узла текстового узла (?)

Пример:

<!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 оба корректно выводят:

2
2

При раскомментировании console.dir(e), сейчасIE9 выводит:

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

Это ошибка?Если это так, есть ли обходной путь для «обновления» и отображения фактического состояния childNodes, кроме console.dir?

Обновление То, что в данный момент работает, добавляет / удаляетузел, например:

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

1 Ответ

1 голос
/ 22 октября 2011

Вы можете использовать обходной путь вместо 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;
}
...