ページの読み込み後にJavaScriptを実行する方法は?


737

<script>内部を使用して、外部スクリプトを実行してい<head>ます。

ページがロードされる前にスクリプトが実行されるため<body>、特ににアクセスできません。ドキュメントが "ロード"された後にHTMLを実行したい(HTMLが完全にダウンロードされ、RAM内に)。スクリプトの実行時にフックできるイベントがあり、ページの読み込み時にトリガーされますか?

回答:


837

これらのソリューションは機能します:

<body onload="script();">

または

document.onload = function ...

あるいは

window.onload = function ...

ことを注意最後のオプションが行くには良い方法であることがあるので、unobstrusiveとされる多くの標準と考え


5
<body onload = "script();">とdocument.onload = function ...の違いは何ですか?
Mentoliptus 2011

11
@mentoliptus:邪魔にならdocument.onload=ない en.wikipedia.org/wiki/Unobtrusive_JavaScript
marcgg

3
HTML内のスクリプト...いいえいいえいいえ$(function(){ここにコード}); <

21
@gerdi OPはjQueryについて何も言及していません。私はまた、私の回答に控えめなオプションを与えました。
marcgg 2014年

1
document.onloadが機能しませんでした。私はこの投稿w /同じ問題stackoverflow.com/questions/5135638/…を見つけました。document.onloadはオプションのようではないようです。
spottedmahn 2017

196

ロード時に実行する関数をスクリプトに設定させる、合理的に移植可能なフレームワークではない方法:

if(window.attachEvent) {
    window.attachEvent('onload', yourFunctionName);
} else {
    if(window.onload) {
        var curronload = window.onload;
        var newonload = function(evt) {
            curronload(evt);
            yourFunctionName(evt);
        };
        window.onload = newonload;
    } else {
        window.onload = yourFunctionName;
    }
}

10
6か月前に思いついたものをほぼ正確に投稿するための+1。このようなコードは、制御できない他のフレームワークやコードがonloadイベントを追加していて、他のonloadイベントを消去せずに追加したい場合に必要になることがあります。私は自分の実装を関数として含めましたが、これにはvar newonload = function(evt){curronload(evt);が必要でした。newOnload(evt); 何らかの理由で、私が使用しているフレームワークでは、イベントをonloadイベントに渡す必要があるためです。
Grant Wagner

6
テストで、記述されたコードの結果、attachEvent()でアタッチされたときにハンドラーが未定義の順序で起動されることがわかりました。order-of-handler-executionが重要な場合は、window.attachEventブランチを省略できます。
Grant Wagner、

したがって、これはこの関数を追加関数として追加して、OnLoadを実行します。よろしいですか?(既存のonloadイベントを置き換えるのではなく)
クレイニコルズ

@ClayNichols:正解です。
2017年

2
良い解決策が、今時代遅れ:developer.mozilla.org/en-US/docs/Web/API/EventTarget/...
ルナン

192

ページのロードには複数の段階があることに注意してください。ところで、これは純粋なJavaScriptです

「DOMContentLoaded」

このイベントは、スタイルシート、画像、サブフレームの読み込みが完了するのを待たずに、最初のHTMLドキュメントが完全に読み込まれて解析されたときに発生します。この段階で、ユーザーデバイスまたは帯域幅の速度に基づいて、画像とCSSの読み込みをプログラムで最適化できます。

DOMが読み込まれた後(imgとcssの前)に実行します。

document.addEventListener("DOMContentLoaded", function(){
    //....
});

注:同期JavaScriptは、DOMの解析を一時停止します。ユーザーがページをリクエストした後、DOMをできるだけ速く解析したい場合は、JavaScriptを非同期にして、スタイルシートのロードを最適化できます。

"負荷"

まったく異なるイベントであるloadは、完全に読み込まれたページを検出するためにのみ使用する必要があります。DOMContentLoadedの方がはるかに適切な場所でloadを使用することは非常によくある間違いであるため、注意が必要です。

すべてが読み込まれて解析された後に実行されます。

window.addEventListener("load", function(){
    // ....
});

MDNリソース:

https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded https://developer.mozilla.org/en-US/docs/Web/Events/load

すべてのイベントのMDNリスト:

https://developer.mozilla.org/en-US/docs/Web/Events


1
それが最後の実行ので@Peterかなり確信してこれはあなたのJavaScriptファイルの一番下に、おそらく最高のそれであれば一人で立っている
arodebaugh

JavascriptはDOMのレンダリングをそこで一時停止し、ページの下部に配置するか、ヘッダーにJavaScript非同期をロードするのが最善の方法です。
DevWL

これが最も完成した答えです。onloadは後ですが、人々は最初はこれを理解していません。
tfont

1
非同期ジャバスクリプト:明確にする、すぐに実行していないスクリプトのための2つの選択肢があります。それらのうち、deferは通常、非同期よりも望ましいです。deferはhtmlの解析/レンダリングを中断しないためです。そして、実行時に、DOMの準備が整っていることが保証されます。deferおよびasyncを使用してJavaScriptを効率的にロードします
ToolmakerSteve

+1 window.onload = ...スクリプトはすべてが完全にダウンロードされるまで待機してから実行されると考えてみましたが、window.onload実際にはのように動作しているようdocument.addEventListener("DOMContentLoaded", ...ですが、window.addEventListener("load", ...実際にはすべてが完全にダウンロードされるまで待機しています。私はそれがではなくwindow.onload同等であるはずだと思いましたか?ChromeとFFで同じ結果が得られました。window.addEventListener("load", ...document.addEventListener("DOMContentLoaded", ...
wkille

121

ボディ内に「onload」属性を配置できます

...<body onload="myFunction()">...

または、jQueryを使用している場合は、

$(document).ready(function(){ /*code here*/ }) 

or 

$(window).load(function(){ /*code here*/ })

それがあなたの質問に答えてくれるといいのですが。

$(window).loadは、ドキュメントがページにレンダリングされた後に実行されることに注意してください。


65

スクリプトが<head>ドキュメントの内に読み込まれている場合はdefer、scriptタグで属性を使用できます。

例:

<script src="demo_defer.js" defer></script>

https://developer.mozilla.orgから:

延期する

このブール属性は、ドキュメントが解析された後、DOMContentLoadedを起動する前にスクリプトが実行されることをブラウザに示すために設定されます。

この属性は、src属性が存在しない場合(つまり、インラインスクリプトの場合)に使用しないでください。この場合、効果はありません。

動的に挿入されたスクリプトに対して同様の効果を得るには、代わりにasync = falseを使用します。defer属性を持つスクリプトは、ドキュメントに表示される順序で実行されます。


私はこのソリューションが大好きです
。JavaScript

27

これは、ページが読み込まれた後の遅延js読み込みに基づくスクリプトです。

<script type="text/javascript">
  function downloadJSAtOnload() {
      var element = document.createElement("script");
      element.src = "deferredfunctions.js";
      document.body.appendChild(element);
  }

  if (window.addEventListener)
      window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
      window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>

これはどこに置きますか?

</body>タグの直前(HTMLファイルの下部近く)のHTMLにコードを貼り付けます。

それは何をするためのものか?

このコードは、ドキュメント全体がロードされるのを待ってから、外部ファイルをロードすることを示していますdeferredfunctions.js

これが上記のコードの例です-JSのレンダリングの延期

私はこれに基づいて書いたJavaScriptのdeferedロードなPageSpeed Googleの考え方も、この記事からソース延期ローディングのjavascript




10
<script type="text/javascript">
  function downloadJSAtOnload() {
   var element = document.createElement("script");
   element.src = "defer.js";
   document.body.appendChild(element);
  }
  if (window.addEventListener)
   window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
   window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>

http://www.feedthebot.com/pagespeed/defer-loading-javascript.html




7

もっと複雑なページで、window.onloadが発生するまでにすべての要素が読み込まれていない場合があります。その場合は、関数が遅延する前にsetTimeoutを追加してください。エレガントではありませんが、うまくレンダリングできる単純なハックです。

window.onload = function(){ doSomethingCool(); };

になる...

window.onload = function(){ setTimeout( function(){ doSomethingCool(); }, 1000); };

5

<body onload="aFunction()">ページが読み込まれた後に呼び出されるように定義するだけです。スクリプト内のコードはで囲まれていaFunction() { }ます。


4
<body onload="myFunction()">

このコードはうまく機能します。

ただし、window.onloadメソッドにはさまざまな依存関係があります。したがって、常に機能するとは限りません。


3

YUIライブラリの使用(大好きです):

YAHOO.util.Event.onDOMReady(function(){
    //your code
});

ポータブルで美しい!ただし、他のものにYUIを使用しない場合(そのドキュメントを参照)、使用する価値はないと私は言います。

注意:このコードを使用するには、2つのスクリプトをインポートする必要があります

<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/yahoo/yahoo-min.js" ></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/event/event-min.js" ></script>

3

ドキュメントが JavaScriptまたはJqueryを使用して読み込まれたかどうかを検出する方法に関する非常に優れたドキュメントがあります。

ネイティブJavascriptを使用すると、これを実現できます

if (document.readyState === "complete") {
 init();
 }

これは区間内でも行うことができます

var interval = setInterval(function() {
    if(document.readyState === 'complete') {
        clearInterval(interval);
        init();
    }    
}, 100);

例:Mozilla

switch (document.readyState) {
  case "loading":
    // The document is still loading.
    break;
  case "interactive":
    // The document has finished loading. We can now access the DOM elements.
    var span = document.createElement("span");
    span.textContent = "A <span> element.";
    document.body.appendChild(span);
    break;
  case "complete":
    // The page is fully loaded.
    console.log("Page is loaded completely");
    break;
}

Jqueryを使用してDOMの準備ができているかどうかのみを確認するには

// A $( document ).ready() block.
$( document ).ready(function() {
    console.log( "ready!" );
});

すべてのリソースが読み込まれているかどうかを確認するには、window.loadを使用します

 $( window ).load(function() {
        console.log( "window loaded" );
    });

3

このコードをjQueryライブラリで使用すると、これで問題なく動作します。

$(window).bind("load", function() { 

  // your javascript event

});

ここにいくつかの説明を追加します
Mathews Sunny

3
$(window).on("load", function(){ ... });

.ready()は私に最適です。

$(document).ready(function(){ ... });

.load()は機能しますが、ページがロードされるまで待機しません。

jQuery(window).load(function () { ... });

次のインラインスクリプトを壊します。他のjQueryフォークと一緒にjQuery 3.2.1も使用しています。

ウェブサイトの読み込みオーバーレイを非表示にするには、次を使用します:

<script>
$(window).on("load", function(){
$('.loading-page').delay(3000).fadeOut(250);
});
</script>

3

JavaScript

document.addEventListener('readystatechange', event => { 

    // When HTML/DOM elements are ready:
    if (event.target.readyState === "interactive") {   //does same as:  ..addEventListener("DOMContentLoaded"..
        alert("hi 1");
    }

    // When window loaded ( external resources are loaded too- `css`,`src`, etc...) 
    if (event.target.readyState === "complete") {
        alert("hi 2");
    }
});

jQueryについても同じです。

$(document).ready(function() {   //same as: $(function() { 
     alert("hi 1");
});

$(window).load(function() {
     alert("hi 2");
});





注: -以下のマークアップは使用しないでください(他の同種の宣言を上書きするため):

document.onreadystatechange = ...

1

Danielが言うように、document.onloadを使用できます。

さまざまなjavascriptフレームワーク(jQuery、Mootoolsなど)はカスタムイベント 'domready'を使用します。JavaScriptで開発している場合は、フレームワークを活用することを強くお勧めします。これにより、生産性が大幅に向上します。



0

asnycページのロード後に外部スクリプトをロードするのに役立つスクリプトタグの属性を使用することをお勧めします

<script type="text/javascript" src="a.js" async></script>
<script type="text/javascript" src="b.js" async></script>

7
w3schoolsによると、非同期が存在する場合:スクリプトはページの残りの部分と非同期で実行されます(ページが解析を続行している間、スクリプトが実行されます)。おそらくdefer、代わりに、@ Daniel Priceが言及したように、
jk7

0

自己実行のonload関数を使用する

window.onload = function (){
    /* statements */
}();   

2
onloadこのアプローチを使用して、他のハンドラーをオーバーライドできます。代わりに、リスナーを追加する必要があります。
Leonid Dashko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.