2010-12-10 7 views
3

AJAX 호출을 통해 XML 데이터를 수신하고 있습니다. 태그 중 하나에 약 4000-5000 자의 많은 양의 텍스트가 있습니다. Firefox에서는 필드가 3000 번째 문자 주위에서 잘 렸습니다. 온라인에서 찾은 대부분의 것들이 노드 값의 크기에는 제한이 없지만 때로는 구현에 따라 달라 지므로 솔리드가 아닙니다.javascript [node] .nodeValue 필드의 크기 제한은 무엇입니까?

nodeValue의 크기에 제한이 없다고 가정 할 때 누구에게 이것이 발생하는지에 대한 제안이 있습니까? 그렇다면 어떤 문제 해결 방법이 있습니까?

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

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

값이 잘립니다.

-xmlHttp.responseText를 인쇄하면 모든 데이터가 인쇄됩니다.

답변

4

체크 this. 그것은 말합니다 :

"중요한 점은 태그 사이에 텍스트가 아무리 많아도 하나의 텍스트 노드에 있어야한다는 것이지만 실제로는 그렇지 않습니다 .Opera 7에서, 9.2x 및 Mozilla/Netscape 6+의 경우 텍스트가 특정 최대 크기보다 큰 경우 여러 텍스트 노드로 분할됩니다. 이러한 텍스트 노드는 부모 요소의 childNodes 컬렉션에서 서로 옆에 있습니다. "

+0

멋진 기사 - 그게 해결책이었습니다! – Jmoney38

+0

http://www.howtocreate.co.uk/은 훌륭한 사이트이기도합니다. – KooiInc

1

@Kooilnc는 Firefox에서 텍스트 노드를 4k로 제한합니다.

이 작업을 수행하여 해결할 수 있습니다 : 여기에서 차용 http://jsfiddle.net/Bkemk/2/

기능 :

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://www.quirksmode.org/dom/tests/textnodesize.html

0

단일 노드를 타겟팅하는 경우 :

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 인지도 확인할 가치가있다.

0

@Ryley

getElementsByTagName과 getElementsById 멀리 계층 구조 아래있는 노드를 반환하기 때문에 내가 직접 아이의 반복을 할 유일한 이유입니다. 더 나은 예로 들어 설명 : 나는 fooTag.getElementsByTagName을 말한다면 ("바"), 그것의 유일하고 진정한 아이 이후 난 단지 (두 번째를 원하는에도 불구하고, 모두의 배열 (S)를 반환 것

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

). 이 "내 직계 아동 만 검색"을 시행하는 것이 생각할 수있는 유일한 방법은 아이들을 반복하는 것입니다.

+0

귀하의 질문과 관련이없는 것 같습니다. 나는 getElementsByTagName이 당신이 묘사하는 방식대로 행동한다는 것에 동의한다. – Ryley

관련 문제