document (নথি)। jQuery ছাড়াই সমতুল্য


2015

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা ব্যবহার করে $(document).readyতবে এটি jQuery থেকে অন্য কিছু ব্যবহার করে না। আমি jQuery নির্ভরতা সরিয়ে এটি হালকা করতে চাই।

আমি কীভাবে $(document).readyjQuery ব্যবহার না করে আমার নিজস্ব কার্যকারিতা বাস্তবায়ন করতে পারি ? আমি জানি যে ব্যবহারগুলি window.onloadএকই রকম হবে না, কারণ window.onloadসমস্ত চিত্র, ফ্রেম ইত্যাদির পরে আগুনগুলি বোঝা হয়ে গেছে।


296
... এবং অবশ্যই একই কার্যকারিতা নয়।
জোয়েল মুয়েলার

40
যেমন এই উত্তরে বলা হয়েছে, jQuery থেকে আপনারা যা চান তা হ'ল $(document).readyআপনি নীচের পৃষ্ঠার পরিবর্তে পৃষ্ঠার একেবারে নীচে আপনার কোডটি চালিয়ে সহজেই সেই সমস্যাটি সমাধান করতে পারেন। এইচটিএমএল 5 বয়লারপ্লেট এই সঠিক পদ্ধতির ব্যবহার করে।
ব্লেজমোনজার

3
শুধু ডমকন্টেন্টলয়েড ব্যবহার করবেন না কেন? এটা তোলে এর IE9 + + caniuse.com/domcontentloaded developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
ব্রক

আমি আমার কলটি ডকুমেন্টের শেষের দিকে রেখেছি এবং এটি আমার সমস্যার সমাধান করে। ফাংশনটি ডাকা হলে, সমস্ত কিছু লোড হয়।
IgniteCoders

উত্তর:


1440

এখানে একটি স্ট্যান্ডার্ড ভিত্তিক প্রতিস্থাপন রয়েছে, DOMContentLoadedযেটি 98% এর বেশি ব্রাউজার দ্বারা সমর্থিত , যদিও আই 8 নয়:

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

নীচের চিত্রিত হিসাবে jQuery এর নেটিভ ফাংশনটি কেবল উইন্ডো.অনলোডের চেয়ে অনেক বেশি জটিল।

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 );
}

19
: একটি প্রকৃত পরিশ্রমী প্লেইন জাভাস্ক্রিপ্ট বাস্তবায়ন এখানে যদি কেউ কোড চায় তারা শুধু এ ড্রপ করতে পারেন stackoverflow.com/questions/9899372/...
jfriend00

4
jQuery DOM প্রস্তুত কোডটি সরলীকৃত বলে মনে হচ্ছে: github.com/jquery/jquery/blob/master/src/core/ تيار.js
জোসে

2
@ জোসনাবাইল যেহেতু তারা পুরানো ব্রাউজার সমর্থন বাদ দিয়েছে
হায়সেট্রুউ

16
আমি মনে করি আমরা সবাই IE8 থেকে এগিয়ে যেতে প্রস্তুত ...;)। লিঙ্কটি ধন্যবাদ, জোসনাবাইল।
কন আন্তোনাকোস

13
স্ক্রিপ্টটি পরে লোড করা থাকলে DOMContentLoaded কাজ করবে না। JQuery নথি প্রস্তুত সর্বদা কার্যকর করা হয়।
জারেড ইনসেল

343

সম্পাদনা:

এখানে jQuery প্রস্তুত একটি কার্যকর প্রতিস্থাপন

function ready(callback){
    // in case the document is already rendered
    if (document.readyState!='loading') callback();
    // modern browsers
    else if (document.addEventListener) document.addEventListener('DOMContentLoaded', callback);
    // IE <= 8
    else document.attachEvent('onreadystatechange', function(){
        if (document.readyState=='complete') callback();
    });
}

ready(function(){
    // do something
});

Https://plainjs.com/javascript/events/running-code-when-toc-docament-is- तैयार-15/ থেকে নেওয়া হয়েছে

Https://stackoverflow.com/a/9899701/175071 থেকে নেওয়া এখানে আরও একটি ভাল ডমরিডি ফাংশন


গ্রহণযোগ্য উত্তর সম্পূর্ণরূপে অনেক দূরে থাকায় আমি jQuery.ready()jQuery 1.6.2 উত্সের উপর ভিত্তি করে একটি "প্রস্তুত" ফাংশন একসাথে সেলাই করেছি :

var ready = (function(){

    var readyList,
        DOMContentLoaded,
        class2type = {};
        class2type["[object Boolean]"] = "boolean";
        class2type["[object Number]"] = "number";
        class2type["[object String]"] = "string";
        class2type["[object Function]"] = "function";
        class2type["[object Array]"] = "array";
        class2type["[object Date]"] = "date";
        class2type["[object RegExp]"] = "regexp";
        class2type["[object Object]"] = "object";

    var ReadyObj = {
        // Is the DOM ready to be used? Set to true once it occurs.
        isReady: false,
        // A counter to track how many items to wait for before
        // the ready event fires. See #6781
        readyWait: 1,
        // Hold (or release) the ready event
        holdReady: function( hold ) {
            if ( hold ) {
                ReadyObj.readyWait++;
            } else {
                ReadyObj.ready( true );
            }
        },
        // Handle when the DOM is ready
        ready: function( wait ) {
            // Either a released hold or an DOMready/load event and not yet ready
            if ( (wait === true && !--ReadyObj.readyWait) || (wait !== true && !ReadyObj.isReady) ) {
                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
                if ( !document.body ) {
                    return setTimeout( ReadyObj.ready, 1 );
                }

                // Remember that the DOM is ready
                ReadyObj.isReady = true;
                // If a normal DOM Ready event fired, decrement, and wait if need be
                if ( wait !== true && --ReadyObj.readyWait > 0 ) {
                    return;
                }
                // If there are functions bound, to execute
                readyList.resolveWith( document, [ ReadyObj ] );

                // Trigger any bound ready events
                //if ( ReadyObj.fn.trigger ) {
                //    ReadyObj( document ).trigger( "ready" ).unbind( "ready" );
                //}
            }
        },
        bindReady: function() {
            if ( readyList ) {
                return;
            }
            readyList = ReadyObj._Deferred();

            // Catch cases where $(document).ready() is called after the
            // browser event has already occurred.
            if ( document.readyState === "complete" ) {
                // Handle it asynchronously to allow scripts the opportunity to delay ready
                return setTimeout( ReadyObj.ready, 1 );
            }

            // Mozilla, Opera and webkit nightlies currently support this event
            if ( document.addEventListener ) {
                // Use the handy event callback
                document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
                // A fallback to window.onload, that will always work
                window.addEventListener( "load", ReadyObj.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", DOMContentLoaded );

                // A fallback to window.onload, that will always work
                window.attachEvent( "onload", ReadyObj.ready );

                // If IE and not a frame
                // continually check to see if the document is ready
                var toplevel = false;

                try {
                    toplevel = window.frameElement == null;
                } catch(e) {}

                if ( document.documentElement.doScroll && toplevel ) {
                    doScrollCheck();
                }
            }
        },
        _Deferred: function() {
            var // callbacks list
                callbacks = [],
                // stored [ context , args ]
                fired,
                // to avoid firing when already doing so
                firing,
                // flag to know if the deferred has been cancelled
                cancelled,
                // the deferred itself
                deferred  = {

                    // done( f1, f2, ...)
                    done: function() {
                        if ( !cancelled ) {
                            var args = arguments,
                                i,
                                length,
                                elem,
                                type,
                                _fired;
                            if ( fired ) {
                                _fired = fired;
                                fired = 0;
                            }
                            for ( i = 0, length = args.length; i < length; i++ ) {
                                elem = args[ i ];
                                type = ReadyObj.type( elem );
                                if ( type === "array" ) {
                                    deferred.done.apply( deferred, elem );
                                } else if ( type === "function" ) {
                                    callbacks.push( elem );
                                }
                            }
                            if ( _fired ) {
                                deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
                            }
                        }
                        return this;
                    },

                    // resolve with given context and args
                    resolveWith: function( context, args ) {
                        if ( !cancelled && !fired && !firing ) {
                            // make sure args are available (#8421)
                            args = args || [];
                            firing = 1;
                            try {
                                while( callbacks[ 0 ] ) {
                                    callbacks.shift().apply( context, args );//shifts a callback, and applies it to document
                                }
                            }
                            finally {
                                fired = [ context, args ];
                                firing = 0;
                            }
                        }
                        return this;
                    },

                    // resolve with this as context and given arguments
                    resolve: function() {
                        deferred.resolveWith( this, arguments );
                        return this;
                    },

                    // Has this deferred been resolved?
                    isResolved: function() {
                        return !!( firing || fired );
                    },

                    // Cancel
                    cancel: function() {
                        cancelled = 1;
                        callbacks = [];
                        return this;
                    }
                };

            return deferred;
        },
        type: function( obj ) {
            return obj == null ?
                String( obj ) :
                class2type[ Object.prototype.toString.call(obj) ] || "object";
        }
    }
    // The DOM ready check for Internet Explorer
    function doScrollCheck() {
        if ( ReadyObj.isReady ) {
            return;
        }

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

        // and execute any waiting functions
        ReadyObj.ready();
    }
    // Cleanup functions for the document ready method
    if ( document.addEventListener ) {
        DOMContentLoaded = function() {
            document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
            ReadyObj.ready();
        };

    } else if ( document.attachEvent ) {
        DOMContentLoaded = function() {
            // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
            if ( document.readyState === "complete" ) {
                document.detachEvent( "onreadystatechange", DOMContentLoaded );
                ReadyObj.ready();
            }
        };
    }
    function ready( fn ) {
        // Attach the listeners
        ReadyObj.bindReady();

        var type = ReadyObj.type( fn );

        // Add the callback
        readyList.done( fn );//readyList is result of _Deferred()
    }
    return ready;
})();

ব্যবহারবিধি:

<script>
    ready(function(){
        alert('It works!');
    });
    ready(function(){
        alert('Also works!');
    });
</script>

এই কোডটি কতটা কার্যকর তা আমি নিশ্চিত নই, তবে এটি আমার পৃষ্ঠাগুলি পরীক্ষাগুলি দিয়ে ভাল কাজ করেছে। এটি বেশ কিছুটা সময় নিয়েছিল, তাই আমি আশা করি আপনি এবং অন্যরা এটির দ্বারা উপকৃত হতে পারেন।

পিএস .: আমি এটি সংকলনের পরামর্শ দিই ।

বা আপনি ব্যবহার করতে পারেন http://dustindiaz.com / ক্ষুদ্রতম প্রস্তুতি- যা :

function r(f){/in/.test(document.readyState)?setTimeout(r,9,f):f()}
r(function(){/*code to run*/});

বা নেটিভ ফাংশন যদি আপনার কেবল নতুন ব্রাউজারগুলিকে সমর্থন করতে হয় (jQuery প্রস্তুত নয়, পৃষ্ঠাটি লোড হওয়ার পরে এটি যুক্ত করলে এটি চলবে না)

document.addEventListener('DOMContentLoaded',function(){/*fun code to run*/})

14
@ টিমোহোভিনেন বিকল্প: জেপ্টো.জেএস (৯.১ কেবি), স্নাক.জেএস (৮.১ কেবি), $ ডোম (২.৩ কেবি) এবং 140 মেডলে (0.5 কেবি)। সম্পাদনা: আপনি এেন্ডারের দিকেও একবার নজর দিতে পারেন।
ফ্রেডেরিক ক্রাউটওয়াল্ড

2
@ ফ্রেডেরিক্রুটওয়াল্ড-ডম শুনতে চাইছে আমি কী চাই, তবে নিশ্চিত না যে এটি বিলটি ফিট করে কিনা। জেপ্টোও সত্যিই আশাব্যঞ্জক দেখাচ্ছে, ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ!
টিমো হুভিনেন

@ টিমোহুভিনেন যদি আপনি ইন্ডারের দিকে না তাকিয়ে থাকেন তবে আপনার অবশ্যই অবশ্যই এক নজরে দেখে নেওয়া উচিত, এন্ডেরজএস ডট কম
ফ্রেডেরিক ক্রাউটওয়াল্ড

2
@ টিমো হুভিনেন: আপনার প্রশ্নটি সত্যই, সত্যই বিস্তৃত! যখন jQuery তৈরি করা হয়েছিল, এটি ব্রাউজারগুলির দ্বারা উত্পাদিত প্রচুর ক্রস ব্রাউজারগুলির সাথে জড়িত যা আজ কম তাত্পর্যপূর্ণ। বর্তমানে, "কেবল জাভাস্ক্রিপ্ট" এর চেয়ে সহজ। এই মুহুর্তে, একটি "বড় 20 কিলোবাইট সংকুচিত, যা সমস্ত রয়েছে" তৈরি করা অবশ্যই একটি ভাল ধারণা ছিল এতগুলি কারণে যে আমি তাদের সমস্ত তালিকাবদ্ধ না করাই পছন্দ করি।
ডটপশ

1
আমি এই পছন্দ করি না। লোকেরা যদি এই উত্তরটিকে পছন্দ করে, আপনি নিজের জায়গায় জিজ্ঞাসা করুন কেন আপনি jQuery প্রথম স্থানে ফেলে রাখতে চান। আপনার ব্রান্ডেলটিতে ফিরে আসা সমস্ত ব্রাউজার ফ্যালব্যাক ব্লাট দিয়ে আপনি ঠিক একই কার্যকারিতাটি বের করতে যাচ্ছেন তবে এটি কিছুটা অর্থহীন। এটি কি প্রথম স্থানে jQuery এড়ানো সম্পূর্ণ পয়েন্ট নয়?
ফিল

207

তিনটি বিকল্প:

  1. যদি scriptশরীরের শেষ ট্যাগ হয় তবে স্ক্রিপ্ট ট্যাগ কার্যকর করার আগে ডিওএম প্রস্তুত হত
  2. যখন ডিওএম প্রস্তুত হবে, "রেডিস্টেট" "সম্পূর্ণ" হয়ে যাবে
  3. ইভেন্ট শ্রোতার অধীনে সবকিছু রাখুন

onreadystatechange

  document.onreadystatechange = function () {
     if (document.readyState == "complete") {
     // document is ready. Do your stuff here
   }
 }

সূত্র: এমডিএন

DOMContentLoaded

document.addEventListener('DOMContentLoaded', function() {
   console.log('document is ready. I can sleep now');
});

প্রস্তর যুগের ব্রাউজারগুলি সম্পর্কে উদ্বিগ্ন: jQuery উত্স কোডে যান এবংreadyফাংশনটিব্যবহার করুন। সেক্ষেত্রে আপনি পার্সিং করছেন না + পুরো গ্রন্থাগারটি কার্যকর করছেন আপনি এটির খুব অল্প অংশই করছেন।


3
এই দ্বিতীয় উদাহরণটি চিহ্নিত উত্তরের চেয়ে অনেক বেশি মার্জিত এবং সংশ্লেষ। কেন এটিকে সঠিক হিসাবে চিহ্নিত করা হয়নি?
0112

2
ডমকন্টেন্টলয়েড জিনিসটির জন্য এখনও +1, এটি আমি যা চেয়েছিলাম ঠিক তা করেছে।
ট্রিপলি

1
অনড্রেসেটেচেন্চ আমার জন্য কৌশলটি করেছে ... অ্যাসিঙ্ক জ্যুচুরি লোডিংয়ের পরে কিছু স্ক্রিপ্ট চালানো দরকার।
আব্রাম

2
ঠিক একটি এফওয়াইআই হিসাবে, # 1 সম্পূর্ণ সত্য নয়। পৃষ্ঠার শেষে কোনও স্ক্রিপ্টের জন্য DOM সম্পন্ন হওয়ার আগে লোড করা বেশ সম্ভব। শ্রোতারা তাই উচ্চতর। ব্রাউজারটি হয়ে গেলে তারা শুনেন। এটিকে শেষে রেখে দেওয়া আপনার আঙ্গুলগুলি পেরিয়ে যাচ্ছে যে স্ক্রিপ্টের লোডটি ব্রাউজারের রেন্ডার হতে পারে তার চেয়ে কম ছিল।
মাচাভিটি

1
ডকুমেন্টটি ইতিমধ্যে লোড শেষ হয়ে গেলে এই রূপটিও কাজ করবে, দয়া করে আপনার (ইমো সেরা) উত্তরটি আপডেট করুন: যদি (ডকুমেন্ট.ডিটারস্টেট == 'সম্পূর্ণ') {init (); } অন্য {ডকুমেন্ট.অন্টারস্টেটেঞ্জ = ফাংশন () {যদি (ডকুমেন্ট.ডিটারস্টেট == 'সম্পূর্ণ') {আরআই (); }}}
জেডপায়ার

87

বন্ধ করার ট্যাগের আগে আপনার <script>/*JavaScript code*/</script>ডানদিকে রাখুন । </body>

স্বীকার করা, এটি সবার উদ্দেশ্য অনুসারে না পারে কারণ এটি জাভাস্ক্রিপ্ট ফাইলটিতে একটি লা করার পরিবর্তে এইচটিএমএল ফাইল পরিবর্তন করা প্রয়োজন document.ready, তবে এখনও ...


আমার কাছে মনে হয় যে এখানে সামঞ্জস্যতার সমস্যা রয়েছে যেমন পৃষ্ঠাটি এখনও প্রস্তুত না হওয়ায় আপনি এই বা এই ব্রাউজারগুলিতে এটি বা এটি করতে পারবেন না। দুর্ভাগ্যজনকভাবে আমি আরও পরিষ্কারভাবে মনে করতে পারি না। তবুও এমন এক পদ্ধতির জন্য +1 যা 99% ক্ষেত্রে (এবং ইয়াহু দ্বারা প্রস্তাবিত) যথেষ্ট পরিমাণে কাছে রয়েছে।
বোল্ডেভিন

7
আসলে, পৃষ্ঠার নীচে স্ক্রিপ্ট উপাদান স্থাপন করা প্রায় নিখুঁত সমাধান। এটি ক্রস ব্রাউজারে কাজ করে এবং ডকুমেন্টকে সিমুলেট করে ready কেবলমাত্র অসুবিধাটি হ'ল এটি (কিছুটা) কিছু স্মার্ট কোড ব্যবহার করার চেয়ে বেশি বিঘ্নজনক, আপনাকে আপনার তৈরি বা init ফাংশনটি কল করার জন্য একটি অতিরিক্ত স্ক্রিপ্ট টুকরো যোগ করার জন্য তৈরি করা স্ক্রিপ্টটির ব্যবহারকারীকে জিজ্ঞাসা করতে হবে।
স্টিজন ডি উইট

@ স্টিজেডেভিট - একটি ডিএন ফাংশন কল করার অর্থ কী? ডকুমেন্ট ব্যবহার করে এমন একটি স্ক্রিপ্ট।এটি কল করার জন্য অন্য ক্লায়েন্ট কোডের প্রয়োজন হয় না, এটি স্বয়ংসম্পূর্ণ এবং কোডটি শরীরের শেষে অন্তর্ভুক্ত থাকে যেখানে তার সমতুল্যও স্ব-অন্তর্ভুক্ত থাকতে পারে এবং নাও এটিকে কল করার জন্য অন্য কোডের প্রয়োজন।
nnnnnn

1
কেন স্ক্রিপ্ট না করা পর সমাপনী শরীর ট্যাগ, এবং বন্ধ করার আগে </html>ট্যাগটি?
চার্লস হলব্রো

1
@ চার্লসহলব্রো যদিও সমস্ত ব্রাউজারগুলি এটির সঠিক ব্যাখ্যা করবে, আপনি যদি এটি বৈধ এইচটিএমএল হতে চান তবে htmlট্যাগটিতে কেবল headএবং থাকা উচিত body
আলভারো মন্টোর

66

দরিদ্র মানুষের সমাধান:

var checkLoad = function() {   
    document.readyState !== "complete" ? setTimeout(checkLoad, 11) : alert("loaded!");   
};  

checkLoad();  

ফিডল দেখুন

এটি একটি যুক্ত করা হয়েছে, আমার অনুমান, আরও ভাল সুযোগ এবং পুনরাবৃত্তির চেয়ে কিছুটা ভাল

(function(){
    var tId = setInterval(function() {
        if (document.readyState == "complete") onComplete()
    }, 11);
    function onComplete(){
        clearInterval(tId);    
        alert("loaded!");    
    };
})()

ফিডল দেখুন


8
ফিলিপল্যাংফোর্ড বা কেবল এটিকে একটি এর ভিতরে রাখুন setIntervalএবং পুনরাবৃত্তিটি পুরোপুরি সরিয়ে ফেলুন।
অ্যালেক্স ডব্লিউ

1
@ রাভেরেন, হুম আপনি ঠিক বলেছেন, আমি পোস্টে পোস্ট করার সময় আমি নিশ্চিত হয়েছি যে আমি এটি পরীক্ষা করেছি। যাইহোক, এটি কেবল আরও সরল হয়ে উঠেছে, এখন ফাংশনটি কেবল ডাকা হবে, কোনও মোড়ক নেই।
জাকব স্টার্নবার্গ

24
এটি সেক্সি নয়। না। দুঃখিত। স্টাফগুলি সনাক্ত করতে টাইমার / বিরতি ব্যবহার করা "কাজ করতে পারে" তবে আপনি যদি এই জাতীয় প্রোগ্রামিং চালিয়ে যান তবে এর লবণের কোনও বড় প্রকল্প নাক ডুবতে চলেছে। এইভাবে একসাথে জিনিস হ্যাক করবেন না। সঠিক ভাবে করুন. অনুগ্রহ. এই জাতীয় কোডটি বিকাশের বাস্তুতন্ত্রকে আঘাত করে কারণ এর থেকে আরও ভাল সমাধান রয়েছে এবং আপনি এটি জানেন।
দুদেওয়াদ

1
আমি এই উত্তর অনেক কাছাকাছি মনে dustindiaz.com/smallest-domready-ever : তাই আমি উন্নত স্ক্রিপ্ট jsfiddle.net/iegik/PT7x9
iegik

1
@ রিডব্লমকুইস্ট হ্যাঁ, এবং এটি একটি "ভুল" উপায় এবং এটি আমি নির্দেশ করছি (কিছুটা দৃama়ভাবে হলেও, আমি জানি)। আপনি বলতে পারেন যে এটিকে ভুল করে বাস্তবে বাস্তুসংস্থাকে "সহায়তা" করা হয় তবে সমস্যাটি হ'ল লোকেরা "ভাল" কোডটি গ্রহণ করে কারণ তাদের আরও ভাল কিছু জানার অভিজ্ঞতা নেই বলে লোকেরা "ভাল" কোডটি গ্রহণ করে বাস্তুতন্ত্রকে সহায়তা করে না, কারণ তারপরে তারা সেই খারাপ কোডটি গ্রহণ করবে এবং এটিকে একটি বাস্তব উত্পাদন আর্কিটেকচারাল সমাধানে প্রয়োগ করবে implement সুতরাং, আমি অনুমান করি, আমাদের এই "ভ্রান্তি" সম্পর্কে মতামতের মধ্যে আলাদা করতে হবে।
ডুয়াদওয়াদ

34

আমি এটি ব্যবহার:

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

দ্রষ্টব্য: এটি সম্ভবত কেবলমাত্র নতুন ব্রাউজারগুলির সাথেই কাজ করে, বিশেষত: http://caniuse.com/#feat=domcontentloaded



আপনি যদি ডকুমেন্ট_স্টার্ট বা ডকুমেন্ট_ইডল ইভেন্টটি হুক করে থাকেন তবে এটি ক্রোম এক্সটেনশান সামগ্রী স্ক্রিপ্টগুলিতে দুর্দান্ত কাজ করে।
ভলমাইক

21

সত্যই, আপনি যদি কেবল ইন্টারনেট এক্সপ্লোরার 9+ এর বিষয়ে চিন্তা করেন তবে এই কোডটি প্রতিস্থাপনের জন্য যথেষ্ট হবে jQuery.ready:

    document.addEventListener("DOMContentLoaded", callback);

আপনি যদি ইন্টারনেট এক্সপ্লোরার 6 এবং কিছু সত্যই অদ্ভুত এবং বিরল ব্রাউজারগুলির বিষয়ে চিন্তা করেন তবে এটি কাজ করবে:

domReady: function (callback) {
    // Mozilla, Opera and WebKit
    if (document.addEventListener) {
        document.addEventListener("DOMContentLoaded", callback, false);
        // If Internet Explorer, the event model is used
    } else if (document.attachEvent) {
        document.attachEvent("onreadystatechange", function() {
            if (document.readyState === "complete" ) {
                callback();
            }
        });
        // A fallback to window.onload, that will always work
    } else {
        var oldOnload = window.onload;
        window.onload = function () {
            oldOnload && oldOnload();
            callback();
        }
    }
},

18

এই প্রশ্নটি অনেক আগে জিজ্ঞাসা করা হয়েছিল। যেহেতু কেবল এই প্রশ্নটি দেখার জন্য, এখন এমন একটি সাইট রয়েছে যার নাম "আপনার সম্ভবত জিকিউরির দরকার নেই" যা ভেঙে যায় - আইই সাপোর্টের প্রয়োজনীয় স্তরের দ্বারা - জেকুরির সমস্ত কার্যকারিতা এবং কিছু বিকল্প, ছোট লাইব্রেরি সরবরাহ করে।

আইই 8 ডকুমেন্ট রেডি স্ক্রিপ্ট অনুযায়ী আপনার জিকিউরির দরকার পড়েনি

function ready(fn) {
    if (document.readyState != 'loading')
        fn();
    else if (document.addEventListener)
        document.addEventListener('DOMContentLoaded', fn);
    else
        document.attachEvent('onreadystatechange', function() {
            if (document.readyState != 'loading')
                fn();
        });
}

আমি কেন আশ্চর্য হয়েছি 'onreadystatechange'তার চেয়ে কেন প্রয়োজনীয়document.attachEvent('onload', fn);
লুক

13

আমি সম্প্রতি এটি একটি মোবাইল সাইটের জন্য ব্যবহার করছি। এটি "প্রো জাভাস্ক্রিপ্ট প্রযুক্তি" থেকে জন রেসিগের সরলিকৃত সংস্করণ। এটি অ্যাডএভেন্টের উপর নির্ভর করে।

var ready = ( function () {
  function ready( f ) {
    if( ready.done ) return f();

    if( ready.timer ) {
      ready.ready.push(f);
    } else {
      addEvent( window, "load", isDOMReady );
      ready.ready = [ f ];
      ready.timer = setInterval(isDOMReady, 13);
    }
  };

  function isDOMReady() {
    if( ready.done ) return false;

    if( document && document.getElementsByTagName && document.getElementById && document.body ) {
      clearInterval( ready.timer );
      ready.timer = null;
      for( var i = 0; i < ready.ready.length; i++ ) {
        ready.ready[i]();
      }
      ready.ready = null;
      ready.done = true;
    }
  }

  return ready;
})();

13
এই কোডটি সম্পর্কে সতর্কতা অবলম্বন করুন। এটি $ (ডকুমেন্ট) এর সমতুল্য নয় ready ডকুমেন্ট.বডি প্রস্তুত হওয়ার সময় এই কোডটি কলব্যাককে ট্রিগার করে যা ডিওএম পুরোপুরি লোড হওয়ার গ্যারান্টি দেয় না।
ক্যারোলিস

12

ক্রস ব্রাউজার (পুরানো ব্রাউজারগুলিও) এবং একটি সহজ সমাধান:

var docLoaded = setInterval(function () {
    if(document.readyState !== "complete") return;
    clearInterval(docLoaded);

    /*
        Your code goes here i.e. init()
    */
}, 30);

জেসফিডেলে সতর্কতা দেখানো হচ্ছে


যদি এটি ডিওএম লোড করতে 30 মিলিয়নের বেশি সময় নেয় তবে আপনার কোডটি চলবে না।
কোয়েলক্লেফ

1
@ কিউলক্লেফ এটি সেট করুন অন্তর্বর্তী সময় নির্ধারণ করেনি টাইমআউট
পাভেল

11

JQuery উত্তরটি আমার কাছে বেশ কার্যকর ছিল। একটি সামান্য পরিশোধক সঙ্গে এটি আমার চাহিদা ভাল ফিট। আমি আশা করি এটি অন্য কাউকে সহায়তা করে।

function onReady ( callback ){
    var addListener = document.addEventListener || document.attachEvent,
        removeListener =  document.removeEventListener || document.detachEvent
        eventName = document.addEventListener ? "DOMContentLoaded" : "onreadystatechange"

    addListener.call(document, eventName, function(){
        removeListener( eventName, arguments.callee, false )
        callback()
    }, false )
}

কিছু ব্রাউজারে, উইন্ডোটি removeListenerপ্রসঙ্গে ডকুমেন্টের সাথে ডাকা প্রয়োজন, যেমন। removeListener.call(document, ...
রন

9

এখানে সমস্ত ব্রাউজার জুড়ে কাজ করে এমন ডিওএম প্রস্তুত পরীক্ষা করার জন্য ক্ষুদ্রতম কোড স্নিপেট (এমনকি আই 8):

r(function(){
    alert('DOM Ready!');
});
function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()}

এই উত্তর দেখুন ।


6

এটি আপনার HTML পৃষ্ঠার নীচে কেবল যুক্ত করুন ...

<script>
    Your_Function();
</script>

কারণ, এইচটিএমএল ডকুমেন্টগুলি উপরের নীচে পার্স করা হয়।


7
আপনি কীভাবে জানবেন যে এই কোডটি কার্যকর করা হলে DOM তৈরি হয়? লোডড এবং পার্সড সিএসএস সহ? ব্রাউজারের এপিআই ডমকন্টেন্টলয়েড এর জন্য ডিজাইন করা হয়েছে।
ড্যান

এটি আসলে জেএসের সাথে কী করতে চায় তার উপর নির্ভর করে। পৃষ্ঠাটি শেষ হয়ে গেলে বা না শেষ হলে তার যদি সত্যিই কিছু কার্যকর করা দরকার।
ডেভফ্র্যাসনি

5

এটা খুঁজছেন মূল্য রক সলিড addEvent () এবং http://www.braksator.com/how-to-make-your-own-jquery

সাইটটি নীচে নেমে যাওয়ার ক্ষেত্রে এখানে কোড দেওয়া আছে

function addEvent(obj, type, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(type, fn, false);
        EventCache.add(obj, type, fn);
    }
    else if (obj.attachEvent) {
        obj["e"+type+fn] = fn;
        obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
        obj.attachEvent( "on"+type, obj[type+fn] );
        EventCache.add(obj, type, fn);
    }
    else {
        obj["on"+type] = obj["e"+type+fn];
    }
}

var EventCache = function(){
    var listEvents = [];
    return {
        listEvents : listEvents,
        add : function(node, sEventName, fHandler){
            listEvents.push(arguments);
        },
        flush : function(){
            var i, item;
            for(i = listEvents.length - 1; i >= 0; i = i - 1){
                item = listEvents[i];
                if(item[0].removeEventListener){
                    item[0].removeEventListener(item[1], item[2], item[3]);
                };
                if(item[1].substring(0, 2) != "on"){
                    item[1] = "on" + item[1];
                };
                if(item[0].detachEvent){
                    item[0].detachEvent(item[1], item[2]);
                };
                item[0][item[1]] = null;
            };
        }
    };
}();

// Usage
addEvent(window, 'unload', EventCache.flush);
addEvent(window, 'load', function(){alert("I'm ready");});

দ্বিতীয় লিঙ্কটি নষ্ট হয়ে গেছে।
পিটার মর্টেনসেন


4

এই ক্রস ব্রাউজার কোডটি ডিওএম প্রস্তুত হওয়ার পরে একটি ফাংশন কল করবে:

var domReady=function(func){
    var scriptText='('+func+')();';
    var scriptElement=document.createElement('script');
    scriptElement.innerText=scriptText;
    document.body.appendChild(scriptElement);
};

এখানে কিভাবে এটা কাজ করে:

  1. আপনি যে ফাংশনটি পাস করেছেন তার স্ট্রিং উপস্থাপনা পেতে ফাংশনের পদ্ধতির প্রথম লাইনটি domReadyকল করে toStringএবং তাত্ক্ষণিকভাবে ফাংশনটিকে কল করে এমন একটি অভিব্যক্তিগুলিতে এটি মোড়ানো।
  2. বাকী domReadyবাক্যগুলি দিয়ে একটি স্ক্রিপ্ট উপাদান তৈরি করে bodyএবং এটি নথির সাথে যুক্ত করে।
  3. ব্রাউজারটি bodyডোম প্রস্তুত হওয়ার পরে যুক্ত স্ক্রিপ্ট ট্যাগগুলি চালায় ।

উদাহরণস্বরূপ, আপনি যদি domReady(function(){alert();});এটি করেন:, নীচে bodyউপাদানটিতে যুক্ত হবে :

 <script>(function (){alert();})();</script>

মনে রাখবেন এটি কেবল ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির জন্য কাজ করে। নিম্নলিখিতগুলি কাজ করবে না:domReady(alert);


3

কীভাবে এই সমাধান?

// other onload attached earlier
window.onload=function() {
   alert('test');
};

tmpPreviousFunction=window.onload ? window.onload : null;

// our onload function
window.onload=function() {
   alert('another message');

   // execute previous one
   if (tmpPreviousFunction) tmpPreviousFunction();
};

3
আপনি "লোড" দিয়ে উইন্ডোতে addEventListener ব্যবহার করতে পারেন। শ্রোতাদের একের পর এক মৃত্যুদন্ড কার্যকর করা হয় এবং ম্যানুয়ালি শিকল দেওয়ার দরকার নেই need
জাফি

1
তবে লোড প্রস্তুতের চেয়ে আলাদা। ডকুমেন্টটি প্রস্তুত হওয়ার আগে 'লোড' এমনকি ঘটে। একটি প্রস্তুত নথিতে তার ডোম লোড থাকে, একটি লোড উইন্ডোতে অবশ্যই ডিওএম প্রস্তুত থাকে না। যদিও ভাল উত্তর
Mzn

1
@ মজান: আমি মনে করি এটি পিছনের দিকে। আমি মনে করি উইন্ডো লোড ইভেন্টের আগে ডকুমেন্ট প্রস্তুত হয়ে যায়। "সাধারণভাবে, সমস্ত চিত্র সম্পূর্ণরূপে লোড হওয়ার জন্য অপেক্ষা করা প্রয়োজন হয় না code কোডটি আগে চালানো যেতে পারে তবে, প্রস্তুত () পদ্ধতিতে প্রেরিত কোনও হ্যান্ডলারের মধ্যে রাখা ভাল।" ( api.jquery.com/load-event )
টাইলার রিক

এটি উইন্ডোর বাকি অংশগুলিকে ওভাররাইড করবে the পৃষ্ঠায় ইভেন্টগুলি লোড করবে এবং সমস্যার কারণ হবে। এটি বিদ্যমান ইভেন্টের উপরে ইভেন্ট যুক্ত করা উচিত।
তেওমন শিপাহি

লোড ইভেন্টটি খুব দেরিতে ঘটতে পারে। তৃতীয় পক্ষের বাহ্যিক জেএস / চিত্রগুলির উপর নির্ভর করে এটি ব্যবহার করা বেদনাদায়ক ... এমন একটি প্রতিক্রিয়াহীন সার্ভার যা আপনি নিয়ন্ত্রণ করেন না এবং সবকিছু ব্যর্থ হয়। ডোমকন্টেন্টলয়েড ব্যবহার করা কেবল একটি অপটিমাইজেশন নয়, এটি আরও নিরাপদ!
ডটপশ

3

JQuery এর তুলনায় জাভাস্ক্রিপ্টের সমতুল্য ব্যবহার করা সর্বদা ভাল। একটি কারণ নির্ভর করে এমন একটি কম লাইব্রেরি এবং সেগুলি jQuery সমতুল্যের তুলনায় অনেক দ্রুত।

JQuery সমতুল্যগুলির জন্য একটি দুর্দান্ত রেফারেন্স হ'ল http://youmightnotneedjquery.com/

যতক্ষণ না আপনার প্রশ্ন সম্পর্কিত, আমি উপরের লিঙ্কটি থেকে নীচের কোডটি নিয়েছি :) কেবলমাত্র সতর্কতাই কেবল এটি ইন্টারনেট এক্সপ্লোরার 9 এবং এর পরে কাজ করে।

function ready(fn) {
    if (document.readyState != 'loading') {
        fn();
    }
    else {
        document.addEventListener('DOMContentLoaded', fn);
    }
}

3

সর্বাধিক ন্যূনতম এবং 100% কাজ করছে

আমি প্লেনজেএস থেকে উত্তরটি নিয়েছি এবং এটি আমার পক্ষে ভাল কাজ করছে। এটি প্রসারিত হয় DOMContentLoadedযাতে এটি সমস্ত ব্রাউজারে গ্রহণযোগ্য হয়।


এই ফাংশনটি jQuery এর $(document).ready()পদ্ধতির সমতুল্য :

document.addEventListener('DOMContentLoaded', function(){
    // do something
});

তবে jQuery এর বিপরীতে, এই কোডটি কেবলমাত্র আধুনিক ব্রাউজারগুলিতে সঠিকভাবে চলবে (IE> 8) এবং এই স্ক্রিপ্টটি সন্নিবেশ করার সময় নথিটি ইতিমধ্যে রেন্ডার করা না হলে (যেমন অ্যাজাক্সের মাধ্যমে)। অতএব, আমাদের এটিকে কিছুটা প্রসারিত করতে হবে:

function run() {
    // do something
}

// in case the document is already rendered
if (document.readyState!='loading') run();
// modern browsers
else if (document.addEventListener) 
document.addEventListener('DOMContentLoaded', run);
// IE <= 8
else document.attachEvent('onreadystatechange', function(){
    if (document.readyState=='complete') run();
});

এটি মূলত সমস্ত সম্ভাবনাগুলি কভার করে এবং jQuery সহায়কের জন্য একটি কার্যকর প্রতিস্থাপন।


3

এটি বছর 2020 এবং <script>ট্যাগটির deferবৈশিষ্ট্য রয়েছে।

উদাহরণ স্বরূপ:

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

এটি নির্দিষ্ট করে যে পৃষ্ঠাটি বিশ্লেষণ শেষ করে স্ক্রিপ্টটি কার্যকর করা হয়েছে uted

https://www.w3schools.com/tags/att_script_defer.asp


2

আমরা আমাদের একটি দ্রুত এবং নোংরা ক্রস ব্রাউজার বাস্তবায়ন পেয়েছি যা সর্বনিম্ন বাস্তবায়নের মাধ্যমে সর্বাধিক সাধারণ মামলার কৌশল করতে পারে:

window.onReady = function onReady(fn){
    document.body ? fn() : setTimeout(function(){ onReady(fn);},50);
};

কি doc.body!?
নবী KAZ

2

এখানে উপস্থাপন করা সেটটাইমআউট / সেটআইন্টারভাল সমাধানগুলি কেবল নির্দিষ্ট পরিস্থিতিতে কাজ করবে in

সমস্যাটি বিশেষত 8 টি পর্যন্ত পুরানো ইন্টারনেট এক্সপ্লোরার সংস্করণগুলিতে প্রদর্শিত হয়।

এই সেটটাইমআউট / সেটইন্টারওয়াল সলিউশনগুলির সাফল্যে প্রভাবিত করে পরিবর্তনশীলগুলি হ'ল:

1) dynamic or static HTML
2) cached or non cached requests
3) size of the complete HTML document
4) chunked or non chunked transfer encoding

এই নির্দিষ্ট সমস্যাটি সমাধানের মূল (নেটিভ জাভাস্ক্রিপ্ট) কোডটি এখানে রয়েছে:

https://github.com/dperini/ContentLoaded
http://javascript.nwbox.com/ContentLoaded (test)

এটি সেই কোড যা থেকে jQuery দল তাদের বাস্তবায়ন তৈরি করেছে।


1

আমি যা ব্যবহার করি তা এখানেই দ্রুত এবং আমার মনে হয় এমন সমস্ত ঘাঁটি কভার করে; IE <9 বাদে সব কিছুর জন্য কাজ করে।

(() => { function fn() {
    // "On document ready" commands:
    console.log(document.readyState);
};  
  if (document.readyState != 'loading') {fn()}
  else {document.addEventListener('DOMContentLoaded', fn)}
})();

এটি সমস্ত ক্ষেত্রে ধরা দেয় বলে মনে হচ্ছে:

  • DOM ইতিমধ্যে প্রস্তুত থাকলে অবিলম্বে গুলি চালায় (যদি DOM "লোডিং" না হয় তবে "ইন্টারেক্টিভ" বা "সম্পূর্ণ" হয়)
  • যদি ডিওএম এখনও লোড হয়, এটি কখন ডিওএম উপলব্ধ (ইন্টারেক্টিভ) এর জন্য ইভেন্ট শ্রোতার সেট আপ করে।

ডোমকন্টেন্টলয়েড ইভেন্টটি আইই 9 এবং অন্য সব কিছুতে উপলব্ধ, তাই আমি ব্যক্তিগতভাবে মনে করি এটি ব্যবহার করা ঠিক আছে OK আপনি যদি ES2015 থেকে ES5 তে আপনার কোডটি স্থানান্তর না করে থাকেন তবে নিয়মিত বেনামে ফাংশনটিতে তীর ফাংশন ঘোষণার পুনর্লিখন করুন।

আপনি যদি সমস্ত সম্পদ লোড না হওয়া পর্যন্ত অপেক্ষা করতে চান তবে সমস্ত চিত্র প্রদর্শিত হবে তার পরিবর্তে উইন্ডো.নলোডটি ব্যবহার করুন।


1

আপনার যদি খুব পুরানো ব্রাউজারগুলিকে সমর্থন না করতে হয়, আপনার বাহ্যিক স্ক্রিপ্টটি অ্যাসিঙ্ক বৈশিষ্ট্য দ্বারা লোড করা হলেও এটি করার একটি উপায় এখানে রয়েছে :

HTMLDocument.prototype.ready = new Promise(function(resolve) {
   if(document.readyState != "loading")
      resolve();
   else
      document.addEventListener("DOMContentLoaded", function() {
         resolve();
      });
});

document.ready.then(function() {
   console.log("document.ready");
});

0

আই 9 + এর জন্য:

function ready(fn) {
  if (document.readyState != 'loading'){
    fn();
  } else {
    document.addEventListener('DOMContentLoaded', fn);
  }
}

0

আপনি যদি BODY এর নীচের অংশে jQuery লোড করে চলেছেন তবে jQuery (<func>) বা jQuery (নথি) লিখেছেন এমন কোডের সাথে সমস্যা হচ্ছে ready GitHub থেকে।

নিজস্ব ডকুমেন্ট রেডি ফাংশনটি পুনরায় তৈরি করার পরিবর্তে, জিকুয়েরি উপলব্ধ না হওয়া পর্যন্ত এটি কেবল ফাংশনগুলি ধরে রাখে এবং প্রত্যাশার সাথে jQuery দিয়ে এগিয়ে যায়। JQuery শরীরের নীচে সরানোর বিন্দুটি পৃষ্ঠা লোডটি গতি বাড়ানো এবং আপনি এখনও আপনার টেমপ্লেটের শিরোনামে jqSim.min.js ইনলাইন করে এটি সম্পাদন করতে পারেন।

আমি ওয়ার্ডপ্রেসের সমস্ত স্ক্রিপ্টগুলি পাদলেখের কাছে নিয়ে যাওয়ার জন্য এই কোডটি লিখেছিলাম এবং এই শিম কোডটি এখন সরাসরি শিরোনামে বসে।


0

এটা চেষ্টা কর:

function ready(callback){
    if(typeof callback === "function"){
        document.addEventListener("DOMContentLoaded", callback);
        window.addEventListener("load", callback);
    }else{
        throw new Error("Sorry, I can not run this!");
    }
}
ready(function(){
    console.log("It worked!");
});

হ্যাঁ আপনি দুবার কলব্যাক চালাবেন
অ্যান্ড্রু

0
function onDocReady(fn){ 
    $d.readyState!=="loading" ? fn():document.addEventListener('DOMContentLoaded',fn);
}

function onWinLoad(fn){
    $d.readyState==="complete") ? fn(): window.addEventListener('load',fn);
} 

onDocReadyএইচটিএমএল ডোম সম্পূর্ণরূপে অ্যাক্সেস / পার্স / ম্যানিপুলেট করার জন্য প্রস্তুত হলে একটি কলব্যাক সরবরাহ করে।

সমস্ত কিছু লোড হওয়ার পরে উইন্ডলয়েড একটি কলব্যাক সরবরাহ করে (চিত্র ইত্যাদি)

  • এই ফাংশনগুলি যখনই আপনি চান কল করা যেতে পারে।
  • একাধিক "শ্রোতা" সমর্থন করে।
  • যে কোনও ব্রাউজারে কাজ করবে।

0
(function(f){
  if(document.readyState != "loading") f();
  else document.addEventListener("DOMContentLoaded", f);
})(function(){
  console.log("The Document is ready");
});

এটি কী যুক্ত করে যা অন্যান্য উত্তরগুলি দেয় না?
dwjohnston

এটি একটি স্ব-অন্তর্ভুক্ত ক্লোজার ব্যবহার করে (বিশ্বব্যাপী "উইন্ডো" স্কোপকে জনপ্রিয় করে না) এটি সমস্ত ব্রাউজারে কাজ করে এবং খুব কমপ্যাক্ট। আমি এর মতো অন্য কোনও উত্তর দেখতে পাচ্ছি না।
ডাস্টিন পোয়েসান্ট

এটি ডিওএম ইতিমধ্যে লোড করার পরেও কাজ করে (যেমন jQuery. تيار করে), যা এর উত্তরগুলির বেশিরভাগই ব্যর্থ হয়।
ডাস্টিন পোয়েসান্ট

0

বেশিরভাগ ভ্যানিলা জেএস রেডি ফাংশনগুলি দস্তাবেজটি লোড হওয়ার পরে যেখানে DOMContentLoadedহ্যান্ডলারটি সেট করা হয়েছে সেই দৃশ্যটিকে বিবেচনা করবেন না - যার অর্থ ফাংশনটি কখনই চলবে না । আপনি যদি DOMContentLoadedকোনও asyncবাহ্যিক স্ক্রিপ্টের মধ্যে সন্ধান করেন তবে এটি ঘটতে পারে <script async src="file.js"></script>

DOMContentLoadedডকুমেন্টটি readyStateইতিমধ্যে interactiveবা না থাকলে কেবল নীচের কোডটি পরীক্ষা করে complete

var DOMReady = function(callback) {
  document.readyState === "interactive" || document.readyState === "complete" ? callback() : document.addEventListener("DOMContentLoaded", callback());
};
DOMReady(function() {
  //DOM ready!
});

আপনি পাশাপাশি IE সমর্থন করতে চান:

var DOMReady = function(callback) {
    if (document.readyState === "interactive" || document.readyState === "complete") {
        callback();
    } else if (document.addEventListener) {
        document.addEventListener('DOMContentLoaded', callback());
    } else if (document.attachEvent) {
        document.attachEvent('onreadystatechange', function() {
            if (document.readyState != 'loading') {
                callback();
            }
        });
    }
};

DOMReady(function() {
  // DOM ready!
});

0

আমি কেবল ব্যবহার:

setTimeout(function(){
    //reference/manipulate DOM here
});

এবং document.addEventListener("DOMContentLoaded" //etcএকেবারে শীর্ষের উত্তরের মতো নয় , এটি আইই 9 - পিছনে কাজ করে - http://caniuse.com/#search=DOMContentLoaded কেবলমাত্র আইই 11 হিসাবে ইঙ্গিত করে।

মজার বিষয় হ'লsetTimeout ২০০৯ সালে আমি এই সমাধানে হোঁচট খেয়েছি: ডিওএম ওভারকিলের প্রস্তুতি কি পরীক্ষা করা হচ্ছে? , যা সম্ভবত কিছুটা ভাল বলা যেতে পারে, কারণ আমার অর্থ ছিল "DOM এর তাত্পর্য পরীক্ষা করার জন্য বিভিন্ন ফ্রেমওয়ার্কের আরও জটিল পদ্ধতি ব্যবহার করা কি অত্যধিক দক্ষতা"।

এই কৌশলটি কেন কাজ করে সে সম্পর্কে আমার সেরা ব্যাখ্যাটি হ'ল, যখন এই জাতীয় সেটটাইমআউট সহ স্ক্রিপ্ট পৌঁছে যায় তখন ডিওএম পার্স হওয়ার মাঝখানে থাকে, সুতরাং সেই অপারেশন শেষ না হওয়া পর্যন্ত সেটটাইমআউটের মধ্যে কোডটি কার্যকর করা পিছিয়ে যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.