Ограничение размера для поля javascript [node] .nodeValue? - PullRequest
3 голосов
/ 10 декабря 2010

Я получаю данные XML через вызов AJAX. Один из тегов имеет большой объем текста, примерно 4000-5000 символов. В Firefox поле усекается вокруг 3000-го символа. Почти все, что я нашел в Интернете, говорит, что нет ограничений на размеры значений узлов, но иногда это зависит от реализации - нет четких ответов.

У кого-нибудь есть предложения по поводу того, почему это может происходить, при условии, что нет никаких ограничений на размер nodeValue? Есть ли обходные пути, если так?

<test>
  <foo>very long string...</foo>
</test>

value = testTag.getElementsByTagName("foo").item(0).firstChild.nodeValue;

значение усечено.

-Если я печатаю xmlHttp.responseText, печатаются все данные из.

Ответы [ 4 ]

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

Проверьте это . Там написано:

"Также важно отметить, что, хотя в спецификациях говорится, что независимо от того, сколько текста существует между тегами, все это должно быть в одном текстовом узле, на практике это не всегда так. В Opera 7-9.2x и Mozilla / Netscape 6+, если текст больше определенного максимального размера, он разбивается на несколько текстовых узлов. Эти текстовые узлы будут находиться рядом друг с другом в коллекции childNodes родительского элемента. "

1 голос
/ 10 декабря 2010

@ У Kooilnc все правильно, ограничение в 4 КБ для текстовых узлов в Firefox.

Вы можете обойти это, сделав это:

function getNodeText(xmlNode) {
    if(!xmlNode) return '';
    if(typeof(xmlNode.textContent) != "undefined") return xmlNode.textContent;
    return xmlNode.firstChild.nodeValue;
}

text = getNodeText(document.getElementsByTagName("div").item(0));
alert(text.length);

Смотрите это в действии здесь: http://jsfiddle.net/Bkemk/2/

Функция заимствована отсюда: http://www.quirksmode.org/dom/tests/textnodesize.html

0 голосов
/ 10 декабря 2010

@ Ryley

Единственная причина, по которой я выполняю итерацию по прямым потомкам, заключается в том, что getElementsByTagName и getElementsById будут возвращать узлы, расположенные ниже по иерархии.Лучше объяснить в качестве примера:

<foo>
  <bar>
    <zoo>
       <bar>-</bar>
    </zoo>     
   <bar></bar>
</zoo>

Если я скажу fooTag.getElementsByTagName ("bar"), он будет возвращать массив обоих s, даже если мне нужен только второй (так как это единственное истинное значениеребенок ).Единственный способ заставить меня «искать только моих прямых детей» - это перебирать детей.

0 голосов
/ 10 декабря 2010

То, что я придумал, вместо нацеливания на один узел:

function getDataOfImmediateChild(parentTag, subTagName)
{
    var val = "";
    var listOfChildTextNodes;
    var directChildren = parentTag.childNodes;

    for (m=0; m < directChildren.length; m++)
    {
        if (directChildren[m].nodeName == subTagName)
        {
           /* Found the tag, extract its text value */
           listOfChildTextNodes = directChildren[m].childNodes;
           for (n=0; n < listOfChildTextNodes.length; n++)
           {
              if (typeof listOfChildTextNodes[n] == "TextNode")
                val += listOfChildTextNodes[n].nodeValue;
           }
         }
    }
    return val;

Возможно, стоит также убедиться, что элемент listOfChildTextNodes [n] является TextNode.

...