অসম্পূর্ণভাবে স্ক্রিপ্টগুলি লোড করুন


125

আমি জিকুয়ারি থেকে বেশ কয়েকটি প্লাগইন, কাস্টম উইজেট এবং অন্যান্য কিছু লাইব্রেরি ব্যবহার করছি। ফলস্বরূপ আমার কাছে বেশ কয়েকটি .js এবং .css ফাইল রয়েছে। আমার সাইটের জন্য আমাকে একটি লোডার তৈরি করতে হবে কারণ এটি লোড হতে কিছুটা সময় নেয়। আমি যদি সমস্তগুলি আমদানি করার আগে লোডারটি প্রদর্শন করতে পারি তবে এটি দুর্দান্ত হবে:

<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/myFunctions.js"></script>
<link type="text/css" href="css/main.css" rel="stylesheet" />
... 
....
 etc

আমি বেশ কয়েকটি টিউটোরিয়াল পেয়েছি যা আমাকে জাভাস্ক্রিপ্ট লাইব্রেরিটিকে অবিচ্ছিন্নভাবে আমদানি করতে সক্ষম করে। উদাহরণস্বরূপ আমি এর মতো কিছু করতে পারি:

  (function () {
        var s = document.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = 'js/jquery-ui-1.8.16.custom.min.js';
        var x = document.getElementsByTagName('script')[0];
        x.parentNode.insertBefore(s, x);
    })();

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

যে কোন পথে

এখানে আমি যা ভাবছিলাম তা এখানে ... আমি বিশ্বাস করি ব্রাউজারগুলির একটি ক্যাশে রয়েছে যার কারণে প্রথমবারের জন্য পৃষ্ঠাটি লোড করতে অনেক সময় লাগে এবং পরের বার এটি দ্রুত হয়। সুতরাং আমি যা করার কথা ভাবছি তা হ'ল আমার ইনডেক্স html পৃষ্ঠাকে একটি পৃষ্ঠার সাথে প্রতিস্থাপন করা যা এই সমস্ত ফাইলকে অবিচ্ছিন্নভাবে লোড করে। যখন অজ্যাক্স সমস্ত ফাইল লোড করা হয়ে যায় তখন আমি যে পৃষ্ঠায় ব্যবহারের পরিকল্পনা করছি তাতে পুনঃনির্দেশ করুন। এই পৃষ্ঠাটি ব্যবহার করার সময় ফাইলগুলি লোড হতে বেশি সময় লাগবে না কারণ ব্রাউজারের ক্যাশে ফাইলগুলি অ্যারেডি করা উচিত। আমার সূচী পৃষ্ঠায় (পৃষ্ঠা যেখানে .js এবং .css ফাইল অ্যাসিক্রোনোলিউড লোড হয়ে যায়) আমি ত্রুটিগুলি পাওয়ার কোনও যত্ন করি না। আমি কেবল একটি লোডার প্রদর্শন করব এবং কাজটি করা হয়ে গেলে পৃষ্ঠাটি পুনর্নির্দেশ করব ...

এই ধারণাটি কি একটি ভাল বিকল্প? বা অ্যাসিক্রোনাস পদ্ধতিগুলি প্রয়োগ করার চেষ্টা করা উচিত আমার?


সম্পাদনা

যেভাবে আমি সমস্ত কিছু অ্যাসিঙ্ক লোড করি তা এরকম:

importScripts();

function importScripts()
{
    //import: jquery-ui-1.8.16.custom.min.js
    getContent("js/jquery-1.6.2.min.js",function (code) {
                var s = document.createElement('script');
                s.type = 'text/javascript';
                //s.async = true;
                s.innerHTML=code;
                var x = document.getElementsByTagName('script')[0];
                x.parentNode.insertBefore(s, x);
                setTimeout(insertNext1,1);
            });


    //import: jquery-ui-1.8.16.custom.min.js
    function insertNext1()
    {
        getContent("js/jquery-ui-1.8.16.custom.min.js",function (code) {
                    var s = document.createElement('script');
                    s.type = 'text/javascript';
                    s.innerHTML=code;
                    var x = document.getElementsByTagName('script')[0];
                    x.parentNode.insertBefore(s, x);
                    setTimeout(insertNext2,1);
                });
    }

    //import: jquery-ui-1.8.16.custom.css
    function insertNext2()
    {

        getContent("css/custom-theme/jquery-ui-1.8.16.custom.css",function (code) {
                    var s = document.createElement('link');
                    s.type = 'text/css';
                    s.rel ="stylesheet";
                    s.innerHTML=code;
                    var x = document.getElementsByTagName('script')[0];
                    x.parentNode.insertBefore(s, x);
                    setTimeout(insertNext3,1);
                });
    }

    //import: main.css
    function insertNext3()
    {

        getContent("css/main.css",function (code) {
                    var s = document.createElement('link');
                    s.type = 'text/css';
                    s.rel ="stylesheet";
                    s.innerHTML=code;
                    var x = document.getElementsByTagName('script')[0];
                    x.parentNode.insertBefore(s, x);
                    setTimeout(insertNext4,1);
                });
    }

    //import: jquery.imgpreload.min.js
    function insertNext4()
    {
        getContent("js/farinspace/jquery.imgpreload.min.js",function (code) {
                    var s = document.createElement('script');
                    s.type = 'text/javascript';
                    s.innerHTML=code;
                    var x = document.getElementsByTagName('script')[0];
                    x.parentNode.insertBefore(s, x);
                    setTimeout(insertNext5,1);
                });
    }


    //import: marquee.js
    function insertNext5()
    {
        getContent("js/marquee.js",function (code) {
                    var s = document.createElement('script');
                    s.type = 'text/javascript';
                    s.innerHTML=code;
                    var x = document.getElementsByTagName('script')[0];
                    x.parentNode.insertBefore(s, x);
                    setTimeout(insertNext6,1);
                });
    }


    //import: marquee.css
    function insertNext6()
    {

        getContent("css/marquee.css",function (code) {
                    var s = document.createElement('link');
                    s.type = 'text/css';
                    s.rel ="stylesheet";
                    s.innerHTML=code;
                    var x = document.getElementsByTagName('script')[0];
                    x.parentNode.insertBefore(s, x);
                    setTimeout(insertNext,1);
                });
    }



    function insertNext()
    {
        setTimeout(pageReadyMan,10);        
    }
}


// get the content of url and pass that content to specified function
function getContent( url, callBackFunction )
{
     // attempt to create the XMLHttpRequest and make the request
     try
     {
        var asyncRequest; // variable to hold XMLHttpRequest object
        asyncRequest = new XMLHttpRequest(); // create request object

        // register event handler
        asyncRequest.onreadystatechange = function(){
            stateChange(asyncRequest, callBackFunction);
        } 
        asyncRequest.open( 'GET', url, true ); // prepare the request
        asyncRequest.send( null ); // send the request
     } // end try
     catch ( exception )
     {
        alert( 'Request failed.' );
     } // end catch
} // end function getContent

// call function whith content when ready
function stateChange(asyncRequest, callBackFunction)
{
     if ( asyncRequest.readyState == 4 && asyncRequest.status == 200 )
     {
           callBackFunction(asyncRequest.responseText);
     } // end if
} // end function stateChange

এবং অদ্ভুত অংশটি হ'ল সমস্ত স্টাইলের কাজ প্লাস সমস্ত জাভাস্ক্রিপ্ট ফাংশন। পৃষ্ঠাটি কোনও কারণে নিথর হয়ে আছে যদিও ...

উত্তর:


176

অ্যাসিঙ্ক লোড করার জন্য একটি দম্পতি সমাধান:

//this function will work cross-browser for loading scripts asynchronously
function loadScript(src, callback)
{
  var s,
      r,
      t;
  r = false;
  s = document.createElement('script');
  s.type = 'text/javascript';
  s.src = src;
  s.onload = s.onreadystatechange = function() {
    //console.log( this.readyState ); //uncomment this line to see which ready states are called.
    if ( !r && (!this.readyState || this.readyState == 'complete') )
    {
      r = true;
      callback();
    }
  };
  t = document.getElementsByTagName('script')[0];
  t.parentNode.insertBefore(s, t);
}

আপনি যদি ইতিমধ্যে পৃষ্ঠায় jQuery পেয়েছেন, কেবল ব্যবহার করুন:

$.getScript(url, successCallback)*

তদ্ব্যতীত, ডকুমেন্টটি লোড হওয়ার আগে আপনার স্ক্রিপ্টগুলি লোড করা / সম্পাদন করা সম্ভব হয়েছে, এর অর্থ এই যে document.readyইভেন্টগুলি উপাদানগুলির সাথে আবদ্ধ হওয়ার আগে আপনাকে অপেক্ষা করতে হবে।

কোডটি না দেখে আপনার সমস্যাটি কী তা নির্দিষ্ট করে বলা সম্ভব নয় tell

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

আপনার যদি বিশেষভাবে অভিনব ইন্টারঅ্যাকশন থাকে যা সর্বদা ব্যবহৃত হয় না যার জন্য কোনও ধরণের বৃহত্তর স্ক্রিপ্টের প্রয়োজন হয়, নির্দিষ্ট স্ক্রিপ্টটি প্রয়োজন না হওয়া (অলস লোডিং) লোড করা এড়ানো কার্যকর হবে।

* বোঝানো স্ক্রিপ্টগুলি $.getScriptসম্ভবত ক্যাশে হবে না


যে কেউ Promiseঅবজেক্টের মতো আধুনিক বৈশিষ্ট্যগুলি ব্যবহার করতে পারে তার জন্য loadScriptফাংশনটি উল্লেখযোগ্যভাবে সহজ হয়ে গেছে:

function loadScript(src) {
    return new Promise(function (resolve, reject) {
        var s;
        s = document.createElement('script');
        s.src = src;
        s.onload = resolve;
        s.onerror = reject;
        document.head.appendChild(s);
    });
}

সচেতন থাকুন যে এই সংস্করণটি আর কোনও callbackযুক্তি গ্রহণ করবে না কারণ প্রত্যাবর্তিত প্রতিশ্রুতি কলব্যাক হ্যান্ডেল করবে। আগে যা loadScript(src, callback)হত এখন তা হত loadScript(src).then(callback)

এতে ব্যর্থতা সনাক্ত এবং পরিচালনা করতে সক্ষম হওয়ার অতিরিক্ত বোনাস রয়েছে, উদাহরণস্বরূপ কেউ কল করতে পারে ...

loadScript(cdnSource)
    .catch(loadScript.bind(null, localSource))
    .then(successCallback, failureCallback);

... এবং এটি সিডিএন আউটেজগুলি কৌতূহলীভাবে পরিচালনা করবে।


আমি এটি চেষ্টা করে শুরু করতে চলেছি। তবে আমি যদি এই স্ক্রিপ্টগুলি অন্য পৃষ্ঠায় লোড করি যখন আমি পৃষ্ঠাটি অন্য পৃষ্ঠায় পুনর্নির্দেশ করি এবং সেই পৃষ্ঠাটির একই স্ক্রিপ্টগুলি ঘটে তবে তাদের লোড হতে সময় নেওয়া উচিত নয়। তারা ঠিক ক্যাশে থাকা উচিত? সুতরাং আমি কি পরিবর্তে সেই কৌশলটি প্রয়োগ করব না?
টোনো নাম

1
আমি বাচ্চাকে শরীরের পরিবর্তে মাথার ট্যাগটিতে পরিবর্তন করেছি এবং সংযুক্ত করেছি ... ..var x = ডকুমেন্ট.জেট এলিমেন্টবাই টাইগনাম ('মাথা') [0]; x.appendChild (গুলি);
টোনো নাম

1
টোননাম, আপনি কেবল ব্যবহার করতে পারেন document.head.appendChild, তবে স্ক্রিপ্টগুলিতে স্ক্রিপ্ট যুক্ত করার সাথে কিছু বিশেষ বিষয় রয়েছে <head>; স্ক্রিপ্টগুলি লোড করা এবং কার্যকর করতে বাধা দেয় এমন কিছুই নয়।
zzzzBov

1
আমাকে t.parentNode.insertBefore (t.pender এর বিপরীতে) ব্যবহার করতে হয়েছিল।
ফিল লাএনসা

1
@ মুহাম্মাদ উমর, আপনি যদি document.writeডকুমেন্টটি লোড হওয়ার আগে একটি অতিরিক্ত স্ক্রিপ্ট ট্যাগ লিখে থাকেন, তবে পৃষ্ঠাটি লোড করার অংশ হিসাবে স্ক্রিপ্টটি সিঙ্ক্রোনিকভাবে কার্যকর করা হবে এবং তার নিজের মতো কোনও অ্যাসিনক্রোনাস কলব্যাক আচরণ অন্তর্ভুক্ত করবে না। যদি আপনি কোনও স্ক্রিপ্ট উপাদান তৈরি করে এটি পৃষ্ঠাতে যুক্ত করে থাকেন, তবে আপনার কাছে ইভেন্ট শ্রোতাদের সংযুক্তি দিয়ে ট্রিগার করার জন্য অ্যাক্সেস থাকবে। tl; dr: আপনি কীভাবে জেএস দিয়ে স্ক্রিপ্টটি লোড করছেন তার উপর এটি নির্ভর করে।
zzzzBov

33

এইচটিএমএল 5 এর নতুন 'অ্যাসিঙ্ক' বৈশিষ্ট্যটি কৌশলটি করার কথা। 'আইফুল' র ক্ষেত্রে বেশিরভাগ ব্রাউজারে সমর্থিত।

async - এইচটিএমএল

<script async src="siteScript.js" onload="myInit()"></script>

স্থগিত - এইচটিএমএল

<script defer src="siteScript.js" onload="myInit()"></script>

নতুন অ্যাডসেন্স বিজ্ঞাপন ইউনিট কোড বিশ্লেষণ করার সময় আমি বৈশিষ্ট্যটি এবং একটি অনুসন্ধান আমাকে এখানে নেতৃত্বের দিকে লক্ষ্য করেছে: http://davidwalsh.name/html5-async


পড়ার পর আমার বোঝার থেকে stackoverflow.com/questions/2774373/... , asyn লোড জন্য নয়, কিন্তু নির্ধারণের যখন জাভাস্ক্রিপ্ট অন্তর্ভুক্ত চালানোর জন্য।
জ্যাকডেভ

9
ডিফার বৈশিষ্ট্যটি দস্তাবেজটি লোড এবং পার্স করা এবং ম্যানিপুলেট করার জন্য প্রস্তুত না হওয়া অবধি ব্রাউজারটি স্ক্রিপ্টটির সম্পাদন স্থগিত করে। অ্যাসিঙ্ক বৈশিষ্ট্যটি ব্রাউজারটিকে যত তাড়াতাড়ি সম্ভব স্ক্রিপ্টটি চালিত করে তবে স্ক্রিপ্টটি ডাউনলোড করার সময় নথি পার্সিং ব্লক না করে
shuseel

1
"অ্যাসিন লোড করার জন্য নয়, তবে জাভাস্ক্রিপ্টটি কখন চালানো হবে তা নির্ধারণের জন্য" এটি বিপরীত নয়; সমস্ত ক্ষেত্রে, ব্রাউজারটি ASAP স্ক্রিপ্টটি লোড করা শুরু করবে। তবে এটি async বা deferলোড হওয়ার সময় ছাড়াই বা এটি রেন্ডারিংটিকে ব্লক করবে। সেটিং asyncএটিকে ASAP হিসাবে স্ক্রিপ্টটি ব্লক এবং চালনা না করতে বলবে। সেটিংটি deferএটিকে অবরুদ্ধ না করার কথা বলবে তবে পৃষ্ঠাটি শেষ না হওয়া পর্যন্ত স্ক্রিপ্টটি চালানো নিয়ে অপেক্ষা করুন । সাধারণত স্ক্রিপ্টগুলি ততক্ষণ চালানো কোনও সমস্যা নেই যতক্ষণ না তাদের কোনও নির্ভরতা না থাকে (যেমন jQuery)। যদি একটি স্ক্রিপ্টের অন্যের উপর নির্ভরতা থাকে তবে onLoadএটির জন্য অপেক্ষা করুন।
স্টিজন ডি উইট

@ স্টিজেডেভিট যদি অ্যাসিঙ্ক বা মুলতুবি নির্দিষ্ট না করে তবে কী হবে?
মোহাম্মদ শরীফ সি

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

8

আমি স্ক্রিপ্টগুলি অবিচ্ছিন্নভাবে লোড করেছি (এইচটিএমএল 5 এর বৈশিষ্ট্যটি রয়েছে) যখন সমস্ত স্ক্রিপ্টগুলি যেখানে লোড করা হয় আমি পৃষ্ঠাটিকে সূচি 2 html এ পুনঃনির্দেশ করি যেখানে সূচি 2 এইচটিএমএল একই লাইব্রেরি ব্যবহার করে। কারণ ব্রাউজারগুলির একবার ক্যাশ থাকে পৃষ্ঠাটি একবার সূচি 2 html, সূচী 2। Html এ সেকেন্ডের চেয়ে কম লোড হয় কারণ এটি পৃষ্ঠাটি লোড করার জন্য সমস্ত কিছু রয়েছে। আমার ইনডেক্স.ইচটিএমএল পৃষ্ঠায় আমি যে চিত্রগুলি ব্যবহার করার পরিকল্পনা করছি সেগুলিও লোড করি যাতে ব্রাউজারটি সেই চিত্রগুলি ক্যাশে রাখে। সুতরাং আমার সূচক html দেখতে:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Project Management</title>

    <!-- the purpose of this page is to load all the scripts on the browsers cache so that pages can load fast from now on -->

    <script type="text/javascript">

        function stylesheet(url) {
            var s = document.createElement('link');
            s.type = 'text/css';
            s.async = true;
            s.src = url;
            var x = document.getElementsByTagName('head')[0];
            x.appendChild(s);
        }

        function script(url) {
            var s = document.createElement('script');
            s.type = 'text/javascript';
            s.async = true;
            s.src = url;
            var x = document.getElementsByTagName('head')[0];
            x.appendChild(s);
        }

        //load scritps to the catche of browser
        (function () {            
                stylesheet('css/custom-theme/jquery-ui-1.8.16.custom.css');
                stylesheet('css/main.css');
                stylesheet('css/marquee.css');
                stylesheet('css/mainTable.css');

                script('js/jquery-ui-1.8.16.custom.min.js');
                script('js/jquery-1.6.2.min.js');
                script('js/myFunctions.js');
                script('js/farinspace/jquery.imgpreload.min.js');
                script('js/marquee.js');            
        })();

    </script>

    <script type="text/javascript">
       // once the page is loaded go to index2.html
        window.onload = function () {
            document.location = "index2.html";
        }
    </script>

</head>
<body>

<div id="cover" style="position:fixed; left:0px; top:0px; width:100%; height:100%; background-color:Black; z-index:100;">Loading</div>

<img src="images/home/background.png" />
<img src="images/home/3.png"/>
<img src="images/home/6.jpg"/>
<img src="images/home/4.png"/>
<img src="images/home/5.png"/>
<img src="images/home/8.jpg"/>
<img src="images/home/9.jpg"/>
<img src="images/logo.png"/>
<img src="images/logo.png"/>
<img src="images/theme/contentBorder.png"/>

</body>
</html>

এ সম্পর্কে আর একটি সুন্দর বিষয় হ'ল আমি পৃষ্ঠায় একটি লোডার স্থাপন করতে পারি এবং পৃষ্ঠাটি লোড করা শেষ হলে লোডারটি চলে যাবে এবং মিলিসেকেন্ডের ম্যাটটিতে নতুন পৃষ্ঠাটি চলবে।


1
@ মোহাম্মদশারিফসি এটি বিড়ম্বনাপূর্ণ। কেবল প্রিলোড লোড করার জন্য একটি বিশেষ পৃষ্ঠাটি কোনও এসইও বুদ্ধিমান ধারণা বলে মনে হয় না। প্রিলোডিং দুর্দান্ত, তবে এটি অর্জনের জন্য আপনাকে পুনর্নির্দেশের প্রয়োজন হবে না। কেবল কোনও লুকানো ডিভিতে লিঙ্কগুলি আটকে দিন এবং ব্রাউজারটি স্বয়ংক্রিয়ভাবে এটির জন্য আপনার যত্ন নেবে। তারপরে পুনঃনির্দেশ না করে কেবল আসল পৃষ্ঠাটি রেন্ডার করুন। অনুলিপি-পাঠকরা এটি পড়ুন : দয়া করে এইচটিএমএলটি ব্যবহারের আগে ইউএসএফ -88591 এনকোডিংটি ইউটিএফ -8 এ পরিবর্তন করুন যাতে আমাদের বাকী অংশগুলি যে কোনও সময়ে শীঘ্রই এনকোডিং থেকে বেরিয়ে আসতে পারে। ধন্যবাদ!
স্টিজন ডি উইট

: দয়া করে আমার নতুন উত্তর তাকান stackoverflow.com/questions/7718935/load-scripts-asynchronously/...
asmmahmud

8

গুগল থেকে উদাহরণ

<script type="text/javascript">
  (function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js?onload=onLoadCallback';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
  })();
</script>

8

কয়েকটি নোট:

  • s.async = trueএইচটিএমএল 5 ডক্টাইপের জন্য খুব সঠিক নয়, সঠিকটি s.async = 'async'(আসলে ব্যবহার true করা সঠিক , অ্যামন কে ধন্যবাদ যে এটি নীচের মন্তব্যে এটিকে নির্দেশ করেছে )
  • অর্ডার নিয়ন্ত্রণ করতে টাইমআউটগুলি ব্যবহার করা খুব ভাল এবং নিরাপদ নয় এবং আপনি সমস্ত টাইমআউটগুলির যোগফলকে সমান করতে লোডিংয়ের সময়টিকে আরও বড় করে তোলেন!

যেহেতু অবিচ্ছিন্নভাবে ফাইলগুলি লোড করার সাম্প্রতিক কারণ রয়েছে, তবে ক্রম হিসাবে, আমি আপনার উদাহরণের তুলনায় কিছুটা আরও কার্যকরভাবে চালিত উপায়ের প্রস্তাব করব ( console.logউত্পাদন ব্যবহারের জন্য অপসারণ :)):

(function() {
    var prot = ("https:"===document.location.protocol?"https://":"http://");

    var scripts = [
        "path/to/first.js",
        "path/to/second.js",
        "path/to/third.js"
    ];

    function completed() { console.log('completed'); }  // FIXME: remove logs

    function checkStateAndCall(path, callback) {
        var _success = false;
        return function() {
            if (!_success && (!this.readyState || (this.readyState == 'complete'))) {
                _success = true;
                console.log(path, 'is ready'); // FIXME: remove logs
                callback();
            }
        };
    }

    function asyncLoadScripts(files) {
        function loadNext() { // chain element
            if (!files.length) completed();
            var path = files.shift();
            var scriptElm = document.createElement('script');
            scriptElm.type = 'text/javascript';
            scriptElm.async = true;
            scriptElm.src = prot+path;
            scriptElm.onload = scriptElm.onreadystatechange = \
                checkStateAndCall(path, loadNext); // load next file in chain when
                                                   // this one will be ready 
            var headElm = document.head || document.getElementsByTagName('head')[0];
            headElm.appendChild(scriptElm);
        }
        loadNext(); // start a chain
    }

    asyncLoadScripts(scripts);
})();

4
s.async = trueহয় সঠিকডাব্লুasync 3 সি এর এইচটিএমএল 5 এর সুপারিশে সম্পত্তিটি স্পষ্টভাবে নির্দিষ্ট করা হয়েছে w3.org/TR/html5/scriptting-1.html#attr-script-async এ । আপনি বিভ্রান্তিকর হয় async অ্যাট্রিবিউট সঙ্গে asyncবাস্তবায়ন বস্তু দ্বারা উদ্ভাসিত সম্পত্তি HTMLScriptElementকরে DOM ইন্টারফেস। প্রকৃতপক্ষে, উপাদানটির সাথে সম্পর্কিত বৈশিষ্ট্যগুলি এমন কোনও কিছুর মাধ্যমে পরিচালনা করার সময় Element.setAttributeআপনার element.setAttribute("async", "async")সমস্ত HTML বৈশিষ্ট্য প্রথম এবং সর্বাধিক পাঠ্য হিসাবে ব্যবহার করা উচিত ।
amn

"যেহেতু অবিচ্ছিন্নভাবে ফাইলগুলি লোড করার সাম্প্রতিক কারণ রয়েছে, তবে ক্রমে, আমি আপনার উদাহরণের চেয়ে আরও কিছু কার্যকরী চালিত উপায়ের পরামর্শ দেব [...]"। আমি জানি async সাধারণত "ভাল" তবে আপনি "সাম্প্রতিক" কারণটি উল্লেখ করছেন?
ব্লু

আমি পরিবর্তন করেছি 'যদি (! ফাইলসাইলেথ) সম্পন্ন ();' একটি 'রিটার্ন' যুক্ত করুন: 'যদি (! ফাইলসাইলেথ) {সম্পূর্ণ (); প্রত্যাবর্তন;} '
ফিলি

4

এইচটিএমএল 5 কে ধন্যবাদ, আপনি ট্যাগগুলিতে "অ্যাসিঙ্ক" যুক্ত করে এখন যে স্ক্রিপ্টগুলি অবিচ্ছিন্নভাবে লোড করতে চান তা ঘোষণা করতে পারেন:

<script async>...</script>

দ্রষ্টব্য: অ্যাসিঙ্ক বৈশিষ্ট্যটি কেবলমাত্র বাহ্যিক স্ক্রিপ্টগুলির জন্য (এবং কেবলমাত্র এসসিআর বৈশিষ্ট্য উপস্থিত থাকলে ব্যবহার করা উচিত)।

দ্রষ্টব্য: বহিরাগত স্ক্রিপ্ট কার্যকর করার বিভিন্ন উপায় রয়েছে:

  • যদি অ্যাসিঙ্ক উপস্থিত থাকে: স্ক্রিপ্টটি বাকী পৃষ্ঠার সাথে অ্যাসিঙ্ক্রোনিকভাবে কার্যকর করা হয় (পৃষ্ঠাটি বিশ্লেষণ চালিয়ে যাওয়ার সময় স্ক্রিপ্টটি কার্যকর করা হবে)
  • যদি অ্যাসিঙ্ক উপস্থিত না থাকে এবং ডিফার উপস্থিত থাকে: পৃষ্ঠাটি বিশ্লেষণ শেষ করে স্ক্রিপ্টটি কার্যকর করা হয়
  • অ্যাসিঙ্ক বা ডিফার উভয়ই যদি উপস্থিত না থাকে: স্ক্রিপ্টটি তত্ক্ষণাত্ কার্যকর করা হবে এবং ব্রাউজারটি পৃষ্ঠা বিশ্লেষণ চালিয়ে যাওয়ার আগেই

এটি দেখুন: http://www.w3schools.com/tags/att_script_async.asp


2

আমি কলব্যাকের উপস্থিতি যাচাই করে zzzzBov এর উত্তরটি সম্পূর্ণ করব এবং যুক্তিগুলি পাস করার অনুমতি দেব:

    function loadScript(src, callback, args) {
      var s, r, t;
      r = false;
      s = document.createElement('script');
      s.type = 'text/javascript';
      s.src = src;
      if (typeof(callback) === 'function') {
        s.onload = s.onreadystatechange = function() {
          if (!r && (!this.readyState || this.readyState === 'complete')) {
            r = true;
            callback.apply(args);
          }
        };
      };
      t = document.getElementsByTagName('script')[0];
      t.parent.insertBefore(s, t);
    }

2

এখানে অ্যাসিক্রোনাস স্ক্রিপ্ট লোড করার জন্য একটি দুর্দান্ত সমসাময়িক সমাধান দেওয়া হয়েছে যদিও এটি কেবল assnc মিথ্যা দিয়ে js স্ক্রিপ্টকে সম্বোধন করে

Www.html5rocks.com- এ একটি দুর্দান্ত নিবন্ধ লেখা আছে - স্ক্রিপ্ট লোডিংয়ের ন্যক্কারজনক জলে গভীর ডুব দিন

অনেকগুলি সম্ভাব্য সমাধান বিবেচনা করার পরে, লেখক উপসংহারে এসেছিলেন যে জেএস স্ক্রিপ্টগুলি দ্বারা পৃষ্ঠা রেন্ডারিং এড়ানো থেকে বাঁচতে দেহের উপাদানগুলির শেষের দিকে জেএস স্ক্রিপ্টগুলি যুক্ত করা সর্বোত্তম সম্ভাব্য উপায় way

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

আপনার চারটি স্ক্রিপ্টের নাম রেখে বিবেচনা করে আপনি script1.js, script2.js, script3.js, script4.jsএটি async = false প্রয়োগ করে করতে পারেন :

[
  'script1.js',
  'script2.js',
  'script3.js',
  'script4.js'
].forEach(function(src) {
  var script = document.createElement('script');
  script.src = src;
  script.async = false;
  document.head.appendChild(script);
});

এখন, স্পেস বলছে : একসাথে ডাউনলোড করুন, যত তাড়াতাড়ি সমস্ত ডাউনলোডের সাথে ক্রম সম্পাদন করুন।

ফায়ারফক্স <3.6, অপেরা বলেছেন: এই "অ্যাসিঙ্ক" জিনিসটি কী তা আমার কোনও ধারণা নেই, তবে ঠিক তাই ঘটেছিল আমি জেএসের মাধ্যমে যুক্ত হওয়া স্ক্রিপ্টগুলি ক্রম হিসাবে চালিয়েছি।

সাফারি 5.0 বলেছেন: আমি "অ্যাসিঙ্ক" বুঝি, তবে জেএসের সাথে এটি "মিথ্যা" হিসাবে সেট করা বুঝতে পারি না। আমি আপনার স্ক্রিপ্টগুলি ল্যান্ড করার সাথে সাথেই তা কার্যকর করবো যাই হোক না কেন ক্রমে।

আইই <10 বলেছেন: "অ্যাসিঙ্ক" সম্পর্কে কোনও ধারণা নেই, তবে "অনড্রেসেটেচেনচ" ব্যবহার করে একটি কার্যকারিতা রয়েছে।

অন্য সব কিছুই বলেছেন: আমি আপনার বন্ধু, আমরা এটি বইয়ের মাধ্যমে করব।

এখন, আইই <10 টি সম্পূর্ণরূপে পূর্ণ কোড:

var scripts = [
  'script1.js',
  'script2.js',
  'script3.js',
  'script4.js'
];
var src;
var script;
var pendingScripts = [];
var firstScript = document.scripts[0];

// Watch scripts load in IE
function stateChange() {
  // Execute as many scripts in order as we can
  var pendingScript;
  while (pendingScripts[0] && ( pendingScripts[0].readyState == 'loaded' || pendingScripts[0].readyState == 'complete' ) ) {
    pendingScript = pendingScripts.shift();
    // avoid future loading events from this script (eg, if src changes)
    pendingScript.onreadystatechange = null;
    // can't just appendChild, old IE bug if element isn't closed
    firstScript.parentNode.insertBefore(pendingScript, firstScript);
  }
}

// loop through our script urls
while (src = scripts.shift()) {
  if ('async' in firstScript) { // modern browsers
    script = document.createElement('script');
    script.async = false;
    script.src = src;
    document.head.appendChild(script);
  }
  else if (firstScript.readyState) { // IE<10
    // create a script and add it to our todo pile
    script = document.createElement('script');
    pendingScripts.push(script);
    // listen for state changes
    script.onreadystatechange = stateChange;
    // must set src AFTER adding onreadystatechange listener
    // else we’ll miss the loaded event for cached scripts
    script.src = src;
  }
  else { // fall back to defer
    document.write('<script src="' + src + '" defer></'+'script>');
  }
}

1

আপনার স্ক্রিপ্টগুলি এত ধীরে ধীরে লোড হওয়ার একটি কারণ হ'ল যদি আপনি পৃষ্ঠাটি লোড করার সময় আপনার সমস্ত স্ক্রিপ্টগুলি চালিত করে থাকেন তবে:

callMyFunctions();

পরিবর্তে:

$(window).load(function() {
      callMyFunctions();
});

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

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


1

আমি তোমাদের কটাক্ষপাত করা সুপারিশ করবে Modernizr । এটি একটি ছোট হালকা ওজনের লাইব্রেরি যা আপনি আপনার জাভাস্ক্রিপ্টকে এমন বৈশিষ্ট্যগুলির সাথে সংকীর্ণভাবে লোড করতে পারেন যা আপনাকে ফাইলটি লোড করা হয়েছে কিনা তা যাচাই করে দেখার অনুমতি দেয় এবং স্ক্রিপ্টটি আপনি নির্দিষ্ট করে অন্যটিতে চালিত করে।

এখানে jquery লোড করার একটি উদাহরণ:

Modernizr.load([
  {
    load: '//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js',
    complete: function () {
      if ( !window.jQuery ) {
            Modernizr.load('js/libs/jquery-1.6.1.min.js');
      }
    }
  },
  {
    // This will wait for the fallback to load and
    // execute if it needs to.
    load: 'needs-jQuery.js'
  }
]);

1

আমি এটির সাহায্যে একটি সামান্য পোস্ট লিখেছি, আপনি এখানে আরও পড়তে পারেন https://timber.io/snippets/asynchronously-load-a-script-in-the- ব্রাউজার- উইথ- জাভাস্ক্রিপ্ট / নীচে সহায়ক শ্রেণি। স্ক্রিপ্টটি লোড হওয়ার জন্য এটি স্বয়ংক্রিয়ভাবে অপেক্ষা করবে এবং একবার এটি নির্দিষ্ট করা উইন্ডো বৈশিষ্ট্যটি ফিরিয়ে দেবে।

export default class ScriptLoader {
  constructor (options) {
    const { src, global, protocol = document.location.protocol } = options
    this.src = src
    this.global = global
    this.protocol = protocol
    this.isLoaded = false
  }

  loadScript () {
    return new Promise((resolve, reject) => {
      // Create script element and set attributes
      const script = document.createElement('script')
      script.type = 'text/javascript'
      script.async = true
      script.src = `${this.protocol}//${this.src}`

      // Append the script to the DOM
      const el = document.getElementsByTagName('script')[0]
      el.parentNode.insertBefore(script, el)

      // Resolve the promise once the script is loaded
      script.addEventListener('load', () => {
        this.isLoaded = true
        resolve(script)
      })

      // Catch any errors while loading the script
      script.addEventListener('error', () => {
        reject(new Error(`${this.src} failed to load.`))
      })
    })
  }

  load () {
    return new Promise(async (resolve, reject) => {
      if (!this.isLoaded) {
        try {
          await this.loadScript()
          resolve(window[this.global])
        } catch (e) {
          reject(e)
        }
      } else {
        resolve(window[this.global])
      }
    })
  }
}

ব্যবহার এই রকম:

const loader = new Loader({
    src: 'cdn.segment.com/analytics.js',
    global: 'Segment',
})

// scriptToLoad will now be a reference to `window.Segment`
const scriptToLoad = await loader.load()

1

আপনি এই উইকি নিবন্ধটি আকর্ষণীয় মনে করতে পারেন: http://ajaxpatterns.org/On-Demand_Javascript

এটি কখন এবং কখন এই জাতীয় প্রযুক্তি ব্যবহার করবেন তা ব্যাখ্যা করে।


দুর্ভাগ্যক্রমে, লিঙ্কটি মারা গেছে বলে মনে হচ্ছে। :(
এরিক স্যাস্ট্রান্ড

@ এরিক এর কারণ এটি গতিশীলভাবে লোডিং কোডের একটি প্রাচীন পদ্ধতি: ডি
টেরেঙ্কো

0

ওয়েল, x.parentNodeহেড উপাদানটি ফেরত দেয়, তাই আপনি হেড ট্যাগের ঠিক আগে স্ক্রিপ্টটি সন্নিবেশ করছেন। হয়তো এটাই সমস্যা।

x.parentNode.appendChild()পরিবর্তে চেষ্টা করুন।


0

এই https://github.com/stephen-lazarionok/async-resource-loader দেখুন । এটিতে একটি উদাহরণ রয়েছে যা দেখায় যে কীভাবে একটি শট দিয়ে জেএস, সিএসএস এবং একাধিক ফাইল লোড করতে হয়।


জেকারি নির্ভরতা থেকে মুক্তি পাওয়ার জন্য এটি একটু পরিবর্তন করা সম্ভব
স্টিফেন এল


0

আপনি ফেচ ইঞ্জেকশন ব্যবহার বিবেচনা করেছেন? এই জাতীয় কেসগুলি পরিচালনা করতে আমি একটি ওপেন সোর্স লাইব্রেরি ঘূর্ণন করেছি fet আপনার লোডারটি লাইবটি ব্যবহারের মতো দেখতে এখানে কী:

fetcInject([
  'js/jquery-1.6.2.min.js',
  'js/marquee.js',
  'css/marquee.css',
  'css/custom-theme/jquery-ui-1.8.16.custom.css',
  'css/main.css'
]).then(() => {
  'js/jquery-ui-1.8.16.custom.min.js',
  'js/farinspace/jquery.imgpreload.min.js'
})

পিছনে সামঞ্জস্যতা লিভারেজ বৈশিষ্ট্য সনাক্তকরণ এবং এক্সএইচআর ইনজেকশন বা স্ক্রিপ্ট ডোম উপাদানগুলিতে ফিরে আসা বা ট্যাগগুলি ব্যবহার করে কেবল পৃষ্ঠায় ইনলাইন করুন document.write


0

রেন্ডার-ব্লক করা জাভাস্ক্রিপ্ট দূর করার জন্য আমার কাস্টম সমাধানটি এখানে:

// put all your JS files here, in correct order
const libs = {
  "jquery": "https://code.jquery.com/jquery-2.1.4.min.js",
  "bxSlider": "https://cdnjs.cloudflare.com/ajax/libs/bxslider/4.2.5/jquery.bxslider.min.js",
  "angular": "https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0-beta.2/angular.min.js",
  "ngAnimate": "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0-beta.2/angular-animate.min.js"
}
const loadedLibs = {}
let counter = 0

const loadAsync = function(lib) {
  var http = new XMLHttpRequest()
  http.open("GET", libs[lib], true)
  http.onload = () => {
    loadedLibs[lib] = http.responseText
    if (++counter == Object.keys(libs).length) startScripts()
  }
  http.send()
}

const startScripts = function() {
  for (var lib in libs) eval(loadedLibs[lib])
  console.log("allLoaded")
}

for (var lib in libs) loadAsync(lib)

সংক্ষেপে, এটি আপনার সমস্ত স্ক্রিপ্টগুলি অবিচ্ছিন্নভাবে লোড করে এবং তারপরে ফলস্বরূপ সেগুলি কার্যকর করে।

গিথুব রেপো : https://github.com/mudroljub/js-async-loader


1
কাজ করে নাNo 'Access-Control-Allow-Origin' header is present on the requested resource
আব্রাম

1
এটি সিওআরএস সমস্যা। stackoverflow.com/questions/20035101/…
দাম্জন পাভলিকা

0

এখানে কেউ যদি ES6 ফাংশনটি ব্যবহার করে উদাহরণস্বরূপ প্রতিক্রিয়া ব্যবহার করতে চায়

import {uniqueId} from 'lodash' // optional
/**
 * @param {String} file The path of the file you want to load.
 * @param {Function} callback (optional) The function to call when the script loads.
 * @param {String} id (optional) The unique id of the file you want to load.
 */
export const loadAsyncScript = (file, callback, id) => {
  const d = document
  if (!id) { id = uniqueId('async_script') } // optional
  if (!d.getElementById(id)) {
    const tag = 'script'
    let newScript = d.createElement(tag)
    let firstScript = d.getElementsByTagName(tag)[0]
    newScript.id = id
    newScript.async = true
    newScript.src = file
    if (callback) {
      // IE support
      newScript.onreadystatechange = () => {
        if (newScript.readyState === 'loaded' || newScript.readyState === 'complete') {
          newScript.onreadystatechange = null
          callback(file)
        }
      }
      // Other (non-IE) browsers support
      newScript.onload = () => {
        callback(file)
      }
    }
    firstScript.parentNode.insertBefore(newScript, firstScript)
  } else {
    console.error(`The script with id ${id} is already loaded`)
  }
}


-3

আমি প্রথমে ফাইলগুলি মিনিফাইংয়ের বিষয়ে সন্ধান করার পরামর্শ দেব এবং এটি আপনাকে একটি বড় পর্যাপ্ত গতি বাড়িয়ে দেয় কিনা তা দেখুন। আপনার হোস্টটি যদি ধীর গতিতে থাকে তবে সেই স্থির সামগ্রীটি কোনও সিডিএন-তে রাখার চেষ্টা করতে পারে।

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