2015-05-08 53 views
1

請原諒我的困惑,因爲我偶然發現這一點,我對JavaScript和這種事情是新手。如果我的代碼是垃圾,請原諒我,因爲它是我找到的例子和我想到的事情的組合(並且沒有弄清楚)!無法讀取屬性'getElementsByTagName'爲空

我試圖運行在開放式轉播軟件這個HTML文件:

<html> 
<head> 
    <link rel="stylesheet" href="css/stylesheet_twitter1.css" type="text/css" charset="utf-8"> 
    <script src="js/jquery-2.0.2.min.js" type="text/javascript" charset="utf-8"></script> 
    <script src="js/jstween-1.1.min.js" type="text/javascript" charset="utf-8"></script> 
    <script src="js/countries.js" type="text/javascript" charset="utf-8"></script> 
    <script type="text/javascript"> 

      var timestampOld; 
      var timestamp; 
      var mText4; 

      var xmlDoc; 

      var xhr = new XMLHttpRequest(); 

      var animating = false; 
      var doUpdate = false; 

      function init() { 

       xhr.overrideMimeType('text/xml'); 

       var timeout = this.window.setInterval(function() { 
        pollHandler(); 
       }, 250); 

       $('#mText4').html(''); 
       $('#board').tween({ 
        top:{ 
         start: '80', 
         stop: '0', 
         units: 'px', 
         time: 0, 
         duration: 0.8, 
         effect:'easeOut' 
        } 
       }); 

       $.play(); 
      } 



    </script> 
</head> 
<body onLoad="init()"> 

    <script type="text/javascript"> 
      function pollHandler() 
      { 
       loadData(); 
       if (timestamp != timestampOld) { 
        doUpdate = true; 
       } 
       if (!animating && doUpdate) { 
        updateBoard(); 
       } 
      } 

      function loadData() { 
       xhr.open('GET', 'streamcontrol.xml'); 
       xhr.send(); 
       xhr.onreadystatechange = function(){ 
         xmlDoc = xhr.responseXML; 


         mText4 = getValueFromTag(xmlDoc,'mText4');      
         timestampOld = timestamp; 
         timestamp = getValueFromTag(xmlDoc,'timestamp'); 

       } 
      } 

      function updateBoard() { 


       if ($('#mText4').html() != mText4) { 
        animating = true; 
        $('#mText4').tween({ 
         opacity: { 
          start: 100, 
          stop: 0, 
          time: 0, 
          duration: 0.5, 
          effect: 'easeIn' 
         }, 
         onStop: function(){ 
          $('#mText4').html(mText4); 
         } 
        }); 

        $('#mText4').tween({ 
         opacity: { 
          start: 0, 
          stop: 100, 
          time: 0.5, 
          duration: 0.5, 
          effect: 'easeOut' 
         }, 
         onStop: function(){ 
          animating = false; 
         } 
        }); 
       } 

       $.play(); 

       doUpdate = false; 
      } 

      function getValueFromTag (xmlDoc,tag) { 
       if (xmlDoc.getElementsByTagName(tag).length != 0) { 
        if (xmlDoc.getElementsByTagName(tag)[0].childNodes.length == 0) { 
          return ''; 
         } else { 
          return xmlDoc.getElementsByTagName(tag)[0].childNodes[0].nodeValue; 
        } 
       } else { 
        return ''; 
       } 
      } 
      </script> 
    <div id="board"> 
     <div id="mText4"></div> 
    </div> 
</body> 
</html> 

它工作得很好,但有這個(和其他兩個HTML文件)去了幾個小時後,該軟件會崩潰。這引起了我看它創建的日誌文件,我看到的時候很多下列內容:

Uncaught TypeError: Cannot read property 'getElementsByTagName' of null @http://absolute/D:/obs%20stuff/browserfiles/Twitter1.html334 

於是我就在Firefox,然後將它扔了以下錯誤(同樣,一個LOT):

TypeError: xmlDoc is null 

我知道streamcontrol.xml不是null。我覺得這些錯誤讓我朝着一個好的方向發展,但是在兩天內嘗試了不同的東西,我在不同的線索上看到了大約10多個小時的集體後,我感到很茫然。

+0

'onreadystatechange'經過許多階段。確保你在正確的地方檢查。 –

+0

您是否用[標籤:MSIE]對其進行了測試 – SaidbakR

+0

我已經使用IE進行了測試,所有內容都是災難。缺少各種權限,這是一團糟。我也嘗試過使用Chrome,但沒有完全訪問xml文檔的權限。 – alwade24

回答

1

onreadystatechange不僅會在您的請求成功完成時觸發。您必須檢查就緒狀態是否已完成,並且處理程序中的狀態是否成功。

檢查here的一些使用細節。

通常情況下,你要檢查xhr.readystate === 4知道它有一個響應,那麼檢查狀態(xhr.status === 200意味着成功響應)

+0

爲'xhr.readystate === 4'添加檢查,然後檢查'xhr.status === 200'!我嘗試了類似的東西,但是在我把它們都放在同一張支票上之前,它們都必須是真實的,並且(再次,我對此不太瞭解,所以我可能會錯的),我認爲這只是從來沒有做過它通過驗證。謝謝你,非常感謝!清除了我的控制檯錯誤以及我的OBS日誌錯誤! – alwade24