jquery contents () возвращает текстовый узел для каждого символа в IE - PullRequest
4 голосов
/ 13 декабря 2010

Я реализую синтаксический анализатор, который ищет текстовые узлы, соответствующие шаблонам на верхнем уровне contenteditable div.Мой текущий код:

//$this is the jQuery object of the contenteditable div
$this.keydown(function(event){
    //space bar or enter key
    if(event.keyCode == 32 || event.keyCode == 13){
      // see how many nodes there are in the div
      alert($this.contents().length); 
      $this.contents().each(function(){
          //check if it is a text node
          if(this.nodeType == 3){ 
              //echo if it is a text node
              alert(this.data); 
           }
      });
});

С содержимым «Проверить это» Firefox и Chrome выводят что-то вроде следующего:

«1» (первое предупреждение)
«checkit out "(второе предупреждение)

В то время как IE8 выведет следующее:
12 (первое предупреждение)
, за которым следуют 12 предупреждений, по одному для каждого символа.

В любом случае, я хотел бы получить все символы в отдельный текстовый узел в IE.Есть идеи?

1 Ответ

4 голосов
/ 13 декабря 2010

Для этого есть метод DOM: normalize() (см. Также MDC ). Вы должны вызывать его у предка текстовых узлов, которые вы хотите нормализовать, например, у их родителя. normalize() работает со всем поддеревом узла, для которого он вызывается, поэтому вы можете вызвать его один раз за пределами цикла each().

$this[0].normalize();

Однако в некоторых случаях этот метод вызывает сбой всего браузера в IE 6 и, возможно, в более поздних версиях IE. Возможно, вам придется написать свой собственный. Вот моя реализация:

function normalize(node) {
    var child = node.firstChild, nextChild;
    while (child) {
        if (child.nodeType == 3) {
            while ((nextChild = child.nextSibling) && nextChild.nodeType == 3) {
                child.appendData(nextChild.data);
                node.removeChild(nextChild);
            }
        } else {
            normalize(child);
        }
        child = child.nextSibling;
    }
}
...