1. ホーム
  2. javascript

[解決済み] jQueryを使用しない$(document).ready相当

2022-03-14 02:35:31

質問

を使用するスクリプトがあります。 $(document).ready しかし、それはjQueryの他の何も使用していません。jQueryの依存関係を取り除くことで軽量化したいです。

を実装するにはどうすればよいですか? $(document).ready の機能は、jQuery を使用せずに実現できますか?私が知っているのは window.onload は同じにはなりません。 window.onload は、すべての画像やフレームなどが読み込まれた後に起動します。

解決方法は?

規格に基づいた代替品がある。 DOMContentLoaded でサポートされています。 99%のブラウザが ただし、IE8は除く。

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

jQueryのネイティブ関数は、下図のようにwindow.onloadだけでなく、もっと複雑な機能を持っています。

function bindReady(){
    if ( readyBound ) return;
    readyBound = true;

    // Mozilla, Opera and webkit nightlies currently support this event
    if ( document.addEventListener ) {
        // Use the handy event callback
        document.addEventListener( "DOMContentLoaded", function(){
            document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
            jQuery.ready();
        }, false );

    // If IE event model is used
    } else if ( document.attachEvent ) {
        // ensure firing before onload,
        // maybe late but safe also for iframes
        document.attachEvent("onreadystatechange", function(){
            if ( document.readyState === "complete" ) {
                document.detachEvent( "onreadystatechange", arguments.callee );
                jQuery.ready();
            }
        });

        // If IE and not an iframe
        // continually check to see if the document is ready
        if ( document.documentElement.doScroll && window == window.top ) (function(){
            if ( jQuery.isReady ) return;

            try {
                // If IE is used, use the trick by Diego Perini
                // http://javascript.nwbox.com/IEContentLoaded/
                document.documentElement.doScroll("left");
            } catch( error ) {
                setTimeout( arguments.callee, 0 );
                return;
            }

            // and execute any waiting functions
            jQuery.ready();
        })();
    }

    // A fallback to window.onload, that will always work
    jQuery.event.add( window, "load", jQuery.ready );
}