2017-07-26 28 views
2

document.getElementByIdがwindow.onloadを使用してもnullを返すことがあるdocument.getElementById(10-20で1回)という問題が発生しています。私の関連するコードは以下の通りです。window.onloadを使用してもdocument.getElementByIdがnullになることがある

ptp.html:

<body> 
    <div msa-include-html="msa.html"></div> 
    <script type="text/javascript" src="msa.js"></script> 
    <script type="text/javascript"> 
     includeHTML(); 
    </script> 
    <script type="text/javascript"> 
     window.onload = function() { 
      initForm("urlAction"); 
     } 
    </script> 
</body> 

msa.html:

<form id="msa" method="get"> 
    <input id="input" type="text" name="input" /> 
    <p id="output"></p> 
    <input id="btn" type="submit" value="SUBMIT" /> 
</form> 

msa.js:事前に

includeHTML = function (cb) { 
    var z, i, elmnt, file, xhttp; 
    z = document.getElementsByTagName("*"); 
    for (i = 0; i < z.length; i++) { 
     elmnt = z[i]; 
     file = elmnt.getAttribute("msa-include-html"); 
     if (file) { 
      xhttp = new XMLHttpRequest(); 
      xhttp.onreadystatechange = function() { 
       if (this.readyState == 4 && this.status == 200) { 
        elmnt.innerHTML = this.responseText; 
        elmnt.removeAttribute("msa-include-html"); 
        includeHTML(cb); 
       } 
      } 
      xhttp.open("GET", file, true); 
      xhttp.send(); 
      return; 
     } 
    } 
    if (cb) cb(); 
}; 

function initForm(urlAction) { 
    document.getElementById("msa").action = urlAction; 
    document.getElementById("input").addEventListener("keyup", updateOutput);   
} 

function updateOutput() { 
    var input = document.getElementById("input").value; 
    var output = Number((1/3 * input).toFixed(0)); 
    document.getElementById("output").innerHTML = output.toLocaleString(); 
} 

感謝します。

答えて

2

includeHTML()機能は、の非同期操作を実行してコンテンツを取得します。関数はの後に戻り、その操作はですが、フェッチはの後にの後に終了します。他のコードは、ロードするコンテンツがDOMに存在すると予測します。あなたは今それを持っているよう

ライン

if (cb) cb(); 

はない外、XHRコールバック内にある必要があります。今のところ、コールバックはHTTPリクエストが完了する前に呼び出されます。あなたのコードは、コンテンツがブラウザのキャッシュにあるときにのみ動作します。

関連する問題