문제

다음 JavaScript는 XML 파일에서 널리 사용되는 태그를 읽고 XSL 스타일시트와 출력을 브라우저에 HTML로 적용한다고 가정합니다.

function ShowPopularTags() {
   xml = XMLDocLoad("http://localhost/xml/tags/popular.xml?s=94987898");
   xsl = XMLDocLoad("http://localhost/xml/xsl/popular-tags.xsl");
   if (window.ActiveXObject) {
      // code for IE
      ex = xml.transformNode(xsl);
      ex = ex.replace(/\\/g, "");
      document.getElementById("popularTags").innerHTML = ex;
   } else if (document.implementation && document.implementation.createDocument) {
      // code for Mozilla, Firefox, Opera, etc.
      xsltProcessor = new XSLTProcessor();
      xsltProcessor.importStylesheet(xsl);
      resultDocument = xsltProcessor.transformToFragment(xml, document);
      document.getElementById("popularTags").appendChild(resultDocument);
      var ihtml = document.getElementById("popularTags").innerHTML;
      ihtml = ihtml.replace(/\\/g, "");
      document.getElementById("popularTags").innerHTML = ihtml;
   }
}
ShowPopularTags();

이 스크립트의 문제는 결과 HTML 코드를 출력할 때도 있고 그렇지 않을 때도 있다는 것입니다.어디서 잘못되고 있는지 아는 사람이 있나요?

도움이 되었습니까?

해결책

현재 사용하고 있는 동기식 솔루션을 강제로 사용하고 계십니까? 아니면 비동기식 솔루션도 옵션입니까?과거에 Firefox가 동기식 호출과 관련된 문제를 겪었던 것으로 기억하는데, 그 중 얼마나 많은 문제가 여전히 남아 있는지 모르겠습니다.요청이 실행되는 동안 전체 Firefox 인터페이스가 잠기는 상황을 본 적이 있습니다(시간 초과 설정에 따라 시간이 매우 오래 걸릴 수 있음).

좀 더 많은 작업이 필요하지만 해결책은 다음과 같습니다.이것은 Ajax로 XSLT 항목을 처리하는 데 사용하는 코드입니다(내 코드가 객체 지향이고 처음 로드된 XML 문서에서 적절한 XSL 문서를 구문 분석하는 루프가 포함되어 있기 때문에 약간 다시 작성했습니다).

메모:oCurrentRequest 및 oXMLRequest 버전은 전달되므로 함수 외부에서 선언해야 합니다.

if (window.XMLHttpRequest)
{
  oCurrentRequest = new XMLHttpRequest();
  oCurrentRequest.onreadystatechange = processReqChange;
  oCurrentRequest.open('GET', sURL, true);
  oCurrentRequest.send(null);
}
else if (window.ActiveXObject)
{
  oCurrentRequest = new ActiveXObject('Microsoft.XMLHTTP');
  if (oCurrentRequest)
  {
    oCurrentRequest.onreadystatechange = processReqChange;
    oCurrentRequest.open('GET', sURL, true);
    oCurrentRequest.send();
  }
}

그 후에는 다음과 같은 내용을 포함하는 processReqChange라는 함수가 필요합니다.

function processReqChange()
{
  if (oCurrentRequest.readyState == 4)
  {
    if (oCurrentRequest.status == 200)
    {
      oXMLRequest = oCurrentRequest;
      oCurrentRequest = null;
      loadXSLDoc();
    }
  }
}

그리고 물론 XSL 로딩을 처리하기 위한 두 번째 함수 세트를 생성해야 합니다(예를 들어 loadXSLDoc on에서 시작).

그런 다음 processXSLReqChange가 끝나면 XML 결과와 XSL 결과를 가져와 변환을 수행할 수 있습니다.

다른 팁

글쎄요, 해당 코드는 IE와 다른 모든 것에 대해 완전히 다른 경로를 따릅니다.나는 문제가 그들 중 하나로 제한되어 있다고 가정합니다.어떤 브라우저에서 사용해 보았으며 어떤 브라우저에서 이 오류가 발생합니까?

내가 생각할 수 있는 유일한 다른 점은 PopularTags 요소에 작업을 수행하려고 할 때 해당 요소가 존재하지 않을 수 있다는 것입니다.이 기능은 어떻게 실행되나요?onload/domready 이벤트에서?

단.IE는 문제 없이 스크립트를 실행합니다.Firefox에서 문제가 발생했습니다.PopularTags 요소는 함수를 호출하는 HTML 문서에 존재합니다.

<div id="popularTags" style="line-height:18px"></div>
<script language="javascript" type="text/javascript">
    function ShowPopularTags()
    {
        xml=XMLDocLoad("http://localhost/xml/tags/popular.xml?s=29497105");
        xsl=XMLDocLoad("http://localhost/xml/xsl/popular-tags.xsl");

        if (window.ActiveXObject){
            // code for IE
            ex=xml.transformNode(xsl);
            ex = ex.replace(/\\/g, "");
            document.getElementById("popularTags").innerHTML=ex;
        }
        else if (document.implementation && document.implementation.createDocument){
            // code for Mozilla, Firefox, Opera, etc.
            xsltProcessor=new XSLTProcessor();
            xsltProcessor.importStylesheet(xsl);
            resultDocument = xsltProcessor.transformToFragment(xml,document);
            document.getElementById("popularTags").appendChild(resultDocument);

            var ihtml = document.getElementById("popularTags").innerHTML;
            ihtml = ihtml.replace(/\\/g, "");
            document.getElementById("popularTags").innerHTML = ihtml;
         }
    }

    ShowPopularTags();
</script>    

병렬로 로드되는 문제를 방지하려면(Dan이 암시한 대로) 페이지가 완전히 로드되었을 때만 이러한 스크립팅을 호출하는 것이 좋습니다.

이상적으로는 스크립트 태그를 페이지 헤드에 넣고 ShowPopularTags()를 호출하는 것이 좋습니다.본문 Onload 항목에 있습니다.즉.

<BODY onLoad="ShowPopularTags();">

이렇게 하면 요소가 포함된 HTML이 완전히 로드되기 전에 스크립팅이 호출되므로 document.getElementById("popularTags")가 실패하지 않는다는 것을 완전히 확신할 수 있습니다.

또한 XMLDocLoad 함수를 볼 수 있나요?여기에 비순차적 요소도 포함되어 있으면 xml 및 xsl 개체가 완전히 로드되기 전에 XSLT 변환이 발생하는 문제에 직면할 수 있습니다.

다음은 XMLDocLoad 함수입니다.

function XMLDocLoad(fname)
{
    var xmlDoc;

    if (window.ActiveXObject){
        // code for IE
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async=false;
        xmlDoc.load(fname);

        return(xmlDoc);
    }
    else if(document.implementation && document.implementation.createDocument){
        // code for Mozilla, Firefox, Opera, etc.
        xmlDoc=document.implementation.createDocument("","",null);

        xmlDoc.async=false;
        xmlDoc.load(fname);

        return(xmlDoc);

    }
    else{
        alert('Your browser cannot handle this script');
    }


}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top