2017-07-21 13 views
0

特定の位置に配置された文console.log(document.getElementsByClassName("buttonQ")[0]);は正常に実行されますが、別の特定の位置に配置されたときは同じステートメントが実行されます。異なる位置のnode.getElementsByClassNameの異なる動作

whats going on here ??両方の位置で

ステートメントは、他の文は、文書の読み込みが完了しているされる前にしながら、あなたは、ドキュメントの負荷にMakeRequestを呼び出しているコードにコメントを経由して

//quotes 
    (function(){ 

     window.addEventListener("load", makeRequest); 

     function makeRequest(){ 
     //-----the below statement "console.log" executes succesfully---- 
     console.log(document.getElementsByClassName("buttonQ")[0]); 
     document.getElementsByClassName("buttonQ")[0].addEventListener("click", makeRequest); 
     function reqListener() { 
      if(httpR.readyState === XMLHttpRequest.DONE) { 
      var quote; 
      if(httpR.status === 200) { 
       quote = JSON.parse(httpR.responseText); 
       document.getElementsByClassName("quote")[0].innerHTML = quote[0].body; 
      } else { 
       alert("There was a problem with the request!") 
      } 
      } 
     }  
     var httpR; 
     httpR = new XMLHttpRequest(); 
     httpR.onreadystatechange = reqListener 
     httpR.open("GET", "https://quote-api.glitch.me/pull/1", true); 
     httpR.send(); 
     } 

     //----------------------tweet------------------- 

     //------the below statement "console.log" gives the result "undefined"---- 
     console.log(document.getElementsByClassName("buttonQ")[0]); 


     //document.getElementsByClassName("buttonT")[0].addEventListener("click", tweetEvent); 
     function tweetEvent() { 
     document.getElementsByClassName("quote")[0].normalize(); 
     var tweetToShare = document.getElementsByClassName("quote")[0].childNodes[0].nodeValue; 
     var urlForTweetButton = document.getElementsByClassName("twitter-share-button")[0].getAttribute("href"); 
     urlForTweetButton = urlForTweetButton + "?hashtags=quotes&text=" + encodeURIComponent(tweetToShare); 
     } 

    })(); 
+1

最初のconsole.logは、ウィンドウが読み込まれた後に実行されます。ウィンドウがロードされる前に2番目のステートメントが実行されます。それであなたは未定義になっています –

+1

'makerequest'関数は、ページがロードされ、DOMモデルが準備された後に実行されます。 2番目のステートメントも下に置かれますが、初期の 'readystate'フェーズで実行されるため、DOMモデルには要素は添付されません。あるいは、 'div'ブロックの直後にスクリプトを置くことができるので、反応レンダラーのルート要素のように見つけられます。 –

答えて

1

をマークされています。したがって、その時点で、おそらくまだDOM上に要素.buttonQは存在しないでしょう。

+0

ええ、私はそれを持っています。私は頭の部分に自分のスクリプトタグを追加しました。 私は以下の文を 'document.readyState ===" complete "'という条件でif文の中に入れなければなりません。私はそれをしましたが、動作しませんでした。 – Neel

+0

評価の瞬間に条件が満たされないので、どちらもうまくいきません。 'window'オブジェクトが提供するさまざまなライフサイクルイベントを使用する必要があります。ここにいくつかの詳細があります:https://javascript.info/onload-ondomcontentloaded – groooves

+0

ええ、私は最適な選択は、ウィンドウのロードイベントまたはdocument.onreadystatechangeだと思う – Neel

関連する問題