কীভাবে jQuery get .getScript () পদ্ধতিটি ব্যবহার করে একাধিক জেএস ফাইল অন্তর্ভুক্ত করা যায়


127

আমি জাভাস্ক্রিপ্ট ফাইলগুলি আমার জেএস ফাইলে গতিশীলভাবে অন্তর্ভুক্ত করার চেষ্টা করছি। আমি এটি সম্পর্কে কিছু গবেষণা করেছি এবং jQuery $ .getScript () পদ্ধতিটি খুঁজে পাওয়ার পছন্দসই উপায় হবে।

// jQuery
$.getScript('/path/to/imported/script.js', function()
{
    // script is now loaded and executed.
    // put your dependent JS here.
    // what if the JS code is dependent on multiple JS files? 
});

তবে আমি ভাবছি যে এই পদ্ধতিটি একবারে একাধিক স্ক্রিপ্ট লোড করতে পারে? আমি কেন এটি জিজ্ঞাসা করছি কারণ আমার জাভাস্ক্রিপ্ট ফাইলটি একাধিক জেএস ফাইলের উপর নির্ভর করে।

তুমাকে অগ্রিম ধন্যবাদ.

উত্তর:


315

উত্তরটা হচ্ছে

আপনি এর সাথে প্রতিশ্রুতি ব্যবহার করতে পারেন getScript()এবং সমস্ত স্ক্রিপ্টগুলি লোড না হওয়া পর্যন্ত অপেক্ষা করতে পারেন, এরকম কিছু:

$.when(
    $.getScript( "/mypath/myscript1.js" ),
    $.getScript( "/mypath/myscript2.js" ),
    $.getScript( "/mypath/myscript3.js" ),
    $.Deferred(function( deferred ){
        $( deferred.resolve );
    })
).done(function(){
    
    //place your code here, the scripts are all loaded
    
});

বেহালা

অন্য বেহালার

উপরের কোডে, একটি মুলতুবি যুক্ত করা এবং এটির অভ্যন্তরে সমাধান করা $()jQuery কলের মধ্যে অন্য কোনও ফাংশন রাখার মতো $(func), যেমন এটি একই

$(function() { func(); });

যেমন এটি ডিওএম প্রস্তুত হওয়ার জন্য অপেক্ষা করে, সুতরাং উপরোক্ত উদাহরণে $.whenসমস্ত স্ক্রিপ্টগুলি লোড হওয়ার এবং$.Deferred ডম রেডি কলব্যাকের মধ্যে সমাধান হওয়া কলটির কারণে ডোম প্রস্তুত হওয়ার অপেক্ষা করে।


আরও সাধারণ ব্যবহারের জন্য, একটি কার্যকর ফাংশন

একটি ইউটিলিটি ফাংশন যা স্ক্রিপ্টগুলির যে কোনও অ্যারে গ্রহণ করে তা এইভাবে তৈরি করা যেতে পারে:

$.getMultiScripts = function(arr, path) {
    var _arr = $.map(arr, function(scr) {
        return $.getScript( (path||"") + scr );
    });
        
    _arr.push($.Deferred(function( deferred ){
        $( deferred.resolve );
    }));
        
    return $.when.apply($, _arr);
}

যা এভাবে ব্যবহার করা যেতে পারে

var script_arr = [
    'myscript1.js', 
    'myscript2.js', 
    'myscript3.js'
];

$.getMultiScripts(script_arr, '/mypath/').done(function() {
    // all scripts loaded
});

যেখানে পাথটি সমস্ত স্ক্রিপ্টগুলিতে প্রম্পট করা হবে এবং এটি optionচ্ছিকও রয়েছে, এর অর্থ যদি অ্যারেটি সম্পূর্ণ URL এর অন্তর্ভুক্ত থাকে তবে এটিও এটি করতে পারে এবং সমস্ত পথ একসাথে ছেড়ে চলে যেতে পারে that

$.getMultiScripts(script_arr).done(function() { ...

যুক্তি, ত্রুটি ইত্যাদি

একপাশে, নোট করুন যে doneকলব্যাকটিতে স্ক্রিপ্টগুলিতে পাস করা মিলগুলির সাথে অনেকগুলি আর্গুমেন্ট থাকবে, প্রতিটি যুক্তি প্রতিক্রিয়াযুক্ত অ্যারের প্রতিনিধিত্ব করবে

$.getMultiScripts(script_arr).done(function(response1, response2, response3) { ...

যেখানে প্রতিটি অ্যারের মতো কিছু থাকবে [content_of_file_loaded, status, xhr_object]। আমাদের সাধারণত সেই আর্গুমেন্টগুলি অ্যাক্সেস করার দরকার নেই কারণ স্ক্রিপ্টগুলি যে কোনওভাবে স্বয়ংক্রিয়ভাবে লোড হবে এবং বেশিরভাগ সময় doneকলব্যাক হ'ল আমরা বুঝতে পারি যে সমস্ত স্ক্রিপ্টগুলি লোড হয়েছে, আমি কেবল এটি সম্পূর্ণতার জন্য যুক্ত করছি , এবং বিরল ইভেন্টগুলির জন্য যখন লোড হওয়া ফাইল থেকে আসল পাঠ্য অ্যাক্সেস করা দরকার হয় বা যখন প্রতিটি এক্সএইচআর অবজেক্টে বা এর অনুরূপ কিছুতে অ্যাক্সেসের প্রয়োজন হয়।

এছাড়াও, কোনও স্ক্রিপ্ট লোড করতে ব্যর্থ হলে, ব্যর্থ হ্যান্ডলার কল করা হবে এবং পরবর্তী স্ক্রিপ্টগুলি লোড হবে না

$.getMultiScripts(script_arr).done(function() {
     // all done
}).fail(function(error) {
     // one or more scripts failed to load
}).always(function() {
     // always called, both on success and error
});

11
দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আপনি $.Deferred(function( deferred ){$( deferred.resolve );})এখানে যুক্ত কেন আমাকে ব্যাখ্যা করতে আপত্তি করবেন ?
সোজেন

11
মুলতুবি বস্তুটির এই প্রতিশ্রুতিটির সাথে আসলেই কিছু করার নেই যা আপনাকে একাধিক স্ক্রিপ্টগুলি লোড করতে এবং সেগুলি শেষ হয়ে গেলে কোনও ফাংশন সম্পাদন করতে দেয়। এটি $ () প্রস্তুত কিনা তা যাচাইয়ের পক্ষে যুক্তিযুক্ত, এবং যদি এটির সমাধান হয় তবে এটি অন্য কথায় এটি পরীক্ষা করে দেখুন যে কোনও কোড কার্যকর করার আগে ডিওএম প্রস্তুত রয়েছে, যেমন ডকুমেন্টের মতো ready প্রস্তুতি, এবং আমি সংযুক্তির একটি ভাল উদাহরণ পেয়েছি অনলাইনে স্ক্রিপ্ট পাওয়ার প্রতিশ্রুতি দিয়েছিল যে কোডটিতে বিলম্বিত ডিওএম প্রস্তুত কার্যকারিতা ছিল এবং কেবল এটি একটি ভাল ধারণার মতো বলেই ঠিক রাখার সিদ্ধান্ত নিয়েছে।
অ্যাডেনেও

4
এজন্য যে এজ্যাক্সে ক্যাচিং করা jQuery এ ডিফল্টরূপে বন্ধ করা হয়, এটি চালু করতে এবং ক্যোরিস্ট্রিং করাকে সরাতে: $.ajaxSetup({ cache: true });তবে এটি অন্যান্য এজ্যাক্স কলগুলিকেও প্রভাবিত করতে পারে যেগুলি আপনি ক্যাশে করতে চান না , ডক্সে এটির জন্য আরও অনেক কিছু রয়েছে getScript , এবং ক্যাশেডস্ক্রিপ্ট নামক একটি ক্যাশেড getScript ফাংশন তৈরি করার ক্ষেত্রে সামান্য কিছুটা আছে।
অ্যাডিনিও

3
দেরী গ্রহণের জন্য দুঃখিত। কখনও কখনও আপনার উপায় এখনও বেশিরভাগ কাজ করে না। কারণ কী তা নিশ্চিত নয়। আমি একবারে চারটি স্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করার চেষ্টা করছি। $.when($.getScript(scriptSrc_1), $.getScript(scriptSrc_2), $.getScript(scriptSrc_3), $.getScript(scriptSrc_4), $.Deferred(function(deferred) { $(deferred.resolve); })).done(function() { ... })
sozhen

1
যে কেউ এই কাজটি পেতে পারে না তার জন্য নিশ্চিত করুন যে আপনার জেএস ফাইলগুলিতে কোনও পার্স ত্রুটি নেই যেমন পরীক্ষা করুন যে তারা প্রথমে <script> ট্যাগে সঠিকভাবে লোড করে। jQuery.getScript () এই ত্রুটিগুলি একটি ব্যর্থ লোড হিসাবে বিবেচনা করবে এবং .done () এর পরিবর্তে .fail () ডাকা হবে। @SongtaoZ।
চাঁদ প্রিজম পাওয়ার 0

29

আমি একাধিক স্ক্রিপ্ট সমান্তরালে লোড করতে একটি সাধারণ ফাংশন প্রয়োগ করেছি:

ক্রিয়া

function getScripts(scripts, callback) {
    var progress = 0;
    scripts.forEach(function(script) { 
        $.getScript(script, function () {
            if (++progress == scripts.length) callback();
        }); 
    });
}

ব্যবহার

getScripts(["script1.js", "script2.js"], function () {
    // do something...
});

1
কোনও কারণে, এইটি ইমানুয়ালের চেয়ে ভাল কাজ করেছে। এটি খুব স্বচ্ছ বাস্তবায়নও।
টড

@ স্যাটনাম ধন্যবাদ :)! শীর্ষ উত্তর কিছু লোকের জন্য কাজ করে না (আমাকে সহ) সুতরাং আমি এই সমাধানটি পোস্ট করেছি। এবং এটি দেখতে অনেক সহজ।
আন্দ্রেই

10

আগেরটির মতো কলব্যাকে নিম্নলিখিত প্রয়োজনীয় স্ক্রিপ্টটি লোড করুন:

$.getScript('scripta.js', function()
{
   $.getScript('scriptb.js', function()
   {
       // run script that depends on scripta.js and scriptb.js
   });
});

1
নিশ্চয় এই পদ্ধতিটি চূড়ান্তভাবে স্ক্রিপ্টগুলি ডাউনলোড করবে, চূড়ান্ত সম্পাদনের সময়টি ধীর করে দেবে?
জিম্বো

1
সঠিক, @ জিম্বো - ফর্সা হতে; এটি অকাল-মৃত্যুদন্ড কার্যকর করা ভাল। :)
অ্যালাস্টার

জলপ্রপাতগুলি প্রায় সবসময় এড়ানো উচিত। getScript একটি প্রতিশ্রুতি নিয়ে আসে ... আপনি যখন প্রতিশ্রুতিগুলি সমাধান করেন তখন শুনতে $ ব্যবহার করতে পারেন।
রুই 20

@ রই এবং অন্য যে কেউ: যদি আমার একটি স্পেসিফিক অর্ডার লোড করার জন্য আমার কাছে স্ক্রিপ্টগুলির প্রয়োজন হয়, তবে মূলত বলতে গেলে এই পদ্ধতির সাথে কী ভুল? এবং সুতরাং, এই প্রতিশ্রুতি কী বিকল্প নিয়ে আসে?
ইফেদী ওকনকভো

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

9

কখনও কখনও একটি নির্দিষ্ট ক্রমে স্ক্রিপ্টগুলি লোড করা প্রয়োজন। উদাহরণস্বরূপ jQuery UI এর আগে jQuery লোড করা আবশ্যক। এই পৃষ্ঠার বেশিরভাগ উদাহরণ সমান্তরালে স্ক্রিপ্টগুলি লোড করে (অ্যাসিনক্রোনাসলি) যার অর্থ মৃত্যুদন্ড কার্যকর করার গ্যারান্টি নেই। অর্ডার না করে, স্ক্রিপ্ট yযা নির্ভর করে xউভয় সফলভাবে লোড করা হলেও ভুল ক্রমে ভঙ্গ করতে পারে।

আমি একটি হাইব্রিড পদ্ধতির প্রস্তাব দিচ্ছি যা নির্ভরশীল স্ক্রিপ্টগুলি + alচ্ছিক সমান্তরাল লোডিং + ডিফার্ড অবজেক্টগুলির ক্রমিক লোডিংয়ের অনুমতি দেয় :

/*
 * loads scripts one-by-one using recursion
 * returns jQuery.Deferred
 */
function loadScripts(scripts) {
  var deferred = jQuery.Deferred();

  function loadScript(i) {
    if (i < scripts.length) {
      jQuery.ajax({
        url: scripts[i],
        dataType: "script",
        cache: true,
        success: function() {
          loadScript(i + 1);
        }
      });
    } else {
      deferred.resolve();
    }
  }
  loadScript(0);

  return deferred;
}

/*
 * example using serial and parallel download together
 */

// queue #1 - jquery ui and jquery ui i18n files
var d1 = loadScripts([
  "https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js",
  "https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/i18n/jquery-ui-i18n.min.js"
]).done(function() {
  jQuery("#datepicker1").datepicker(jQuery.datepicker.regional.fr);
});

// queue #2 - jquery cycle2 plugin and tile effect plugin
var d2 = loadScripts([
  "https://cdn.rawgit.com/malsup/cycle2/2.1.6/build/jquery.cycle2.min.js",
  "https://cdn.rawgit.com/malsup/cycle2/2.1.6/build/plugin/jquery.cycle2.tile.min.js"

]).done(function() {
  jQuery("#slideshow1").cycle({
    fx: "tileBlind",
    log: false
  });
});

// trigger a callback when all queues are complete
jQuery.when(d1, d2).done(function() {
  console.log("All scripts loaded");
});
@import url("https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/blitzer/jquery-ui.min.css");

#slideshow1 {
  position: relative;
  z-index: 1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<p><input id="datepicker1"></p>

<div id="slideshow1">
  <img src="https://dummyimage.com/300x100/FC0/000">
  <img src="https://dummyimage.com/300x100/0CF/000">
  <img src="https://dummyimage.com/300x100/CF0/000">
</div>

উভয় কাতারে থাকা স্ক্রিপ্টগুলি সমান্তরালে ডাউনলোড হবে, তবে, প্রতিটি কাতারে থাকা স্ক্রিপ্টগুলি ক্রমানুসারে ডাউনলোড হবে, আদেশিত কার্যকরকরণ নিশ্চিত করে। জলপ্রপাত চার্ট:

স্ক্রিপ্টগুলির জলপ্রপাতের চার্ট


স্ক্রিপ্ট মেমরিতে লোড হয়ে গেলে আমাদের কি এইচটিএমএলে স্ক্রিপ্ট ট্যাগ যুক্ত করার দরকার নেই?
অঙ্কুশ জৈন

4

ব্যবহার করুন yepnope.js বা Modernizr (যা হিসাবে yepnope.js অন্তর্ভুক্ত Modernizr.load)।

হালনাগাদ

কেবল অনুসরণ করতে, একাধিক স্ক্রিপ্টের উপর নির্ভরশীলতা দেখিয়ে আপনি বর্তমানে ইয়েপনোপ ব্যবহার করছেন তার একটি সমতুল্য এখানে:

yepnope({
  load: ['script1.js', 'script2.js', 'script3.js'],
  complete: function () {
      // all the scripts have loaded, do whatever you want here
  }
});

ধন্যবাদ। এইচটিএমএল ফাইলে ট্যাগ যুক্ত yepnope.injectJs( scriptSource )করার মতো আমি কি আমার জাভাস্ক্রিপ্ট ফাইলের শুরুতে একাধিকটি ব্যবহার করতে পারি <script>?
সোজেন

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

+1 টি; লক্ষণীয় যে এটি সঠিকভাবে নির্ভরতা পরিচালনা করে (অর্থাত্ একই স্ক্রিপ্টটি দুইবার লোড করবে না) বিপরীতে$.getScript । এটি একটি বড় চুক্তি।
ওভ

yepnope.js এখন হ্রাস করা হয়েছে
স্টিফান

4

আমি একাধিক সমস্যার মধ্যে দৌড়েছি মাল্টি স্ক্রিপ্ট লোড করে এক ইস্যুতে (অন্তত ক্রোমে) একই ডোমেনের হট লোডিং স্ক্রিপ্টগুলি আসলে অ্যাজাক্স দ্বারা সফলভাবে লোড হওয়ার পরে চলছে না যেখানে ক্রস ডোমেন পুরোপুরি সূক্ষ্মভাবে কাজ করে! :(

মূল প্রশ্নের নির্বাচিত উত্তর নির্ভরযোগ্যভাবে কাজ করে না।

অনেকগুলি পুনরাবৃত্তির পরে এখানে আমার প্রাপ্ত স্ক্রিপ্ট (গুলি) এবং চূড়ান্তভাবে প্রতি স্ক্রিপ্ট লোডড কলব্যাক বিকল্প এবং সামগ্রিক কলব্যাক সমাপ্তির সাথে একটি নির্দিষ্ট কঠোর ক্রমে একচেটিয়াভাবে একাধিক স্ক্রিপ্টগুলি লোড করার চূড়ান্ত উত্তর, jQuery 2.1+ এবং ক্রোমের আধুনিক সংস্করণে পরীক্ষিত, ফায়ারফক্স প্লাস ইন্টারনেট এক্সপ্লোরার ত্যাগ।

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

প্রোটোটাইপ ফাংশন (getScriptts)

function getScripts( scripts, onScript, onComplete )
{
    this.async = true;
    this.cache = false;
    this.data = null;
    this.complete = function () { $.scriptHandler.loaded(); };
    this.scripts = scripts;
    this.onScript = onScript;
    this.onComplete = onComplete;
    this.total = scripts.length;
    this.progress = 0;
};

getScripts.prototype.fetch = function() {
    $.scriptHandler = this;
    var src = this.scripts[ this.progress ];
    console.log('%cFetching %s','color:#ffbc2e;', src);

    $.ajax({
        crossDomain:true,
        async:this.async,
        cache:this.cache,
        type:'GET',
        url: src,
        data:this.data,
        statusCode: {
            200: this.complete
        },
        dataType:'script'
    });
};

getScripts.prototype.loaded = function () {
    this.progress++;
    if( this.progress >= this.total ) {
        if(this.onComplete) this.onComplete();
    } else {
        this.fetch();
    };
    if(this.onScript) this.onScript();
};

ব্যবহারবিধি

var scripts = new getScripts(
    ['script1.js','script2.js','script.js'],
    function() {
        /* Optional - Executed each time a script has loaded (Use for Progress updates?) */
    },
    function () {
        /* Optional - Executed when the entire list of scripts has been loaded */
    }
);
scripts.fetch();

ফাংশনটি যেমনটি হ'ল আমি ডিফার্ড (এখন অবহেলিত?) ব্যবহার করেছি, যখন, আমার পরীক্ষাগুলিতে সাফল্য এবং সম্পূর্ণ 100% নির্ভরযোগ্য না হয় !?, সুতরাং এই ফাংশন এবং উদাহরণস্বরূপ স্থিতি কোডের ব্যবহার।

আপনি ইচ্ছে করলে ত্রুটির সাথে যুক্ত / আচরণের ব্যর্থতা যুক্ত করতে চাইতে পারেন।


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

2

$.whenনিম্নলিখিত ফাংশনটি ব্যবহার করে আপনি- আদর্শটি ব্যবহার করতে পারেন :

function loadScripts(scripts) {
  scripts.forEach(function (item, i) {
    item = $.getScript(item);
  });
  return $.when.apply($, scripts);
}

এই ফাংশনটি এভাবে ব্যবহার করা হবে:

loadScripts(['path/to/script-a.js', 'path/to/script-b.js']).done(function (respA, respB) {
    // both scripts are loaded; do something funny
});

প্রতিশ্রুতিগুলি ব্যবহার করার উপায় এবং সর্বনিম্ন ওভারহেড থাকে।


এটি কি স্ক্রিপ্টগুলি ক্রমানুসারে লোড হচ্ছে তা নিশ্চিত করে?
সাইবারমোনক

2

দুর্দান্ত উত্তর, অ্যাডিনিও

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

    function loadMultipleScripts(scripts, callback){
        var array = [];

        scripts.forEach(function(script){
            array.push($.getScript( script ))
        });

        array.push($.Deferred(function( deferred ){
                    $( deferred.resolve );
                }));

        $.when.apply($, array).done(function(){
                if (callback){
                    callback();
                }
            });
    }

2

Async = মিথ্যা দিয়ে স্ক্রিপ্ট যুক্ত করুন

এখানে একটি পৃথক, কিন্তু সুপার সহজ পদ্ধতির। একাধিক স্ক্রিপ্ট লোড করতে আপনি কেবল এগুলিকে দেহে যুক্ত করতে পারেন।

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

এখানে আরও তথ্য: https://www.html5rocks.com/en/tutorials/speed/script-loading/

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

1

আপনি যা খুঁজছেন তা হ'ল একটি এএমডি কমপ্লায়েন্ট লোডার (যেমন প্রয়োজনীয়.js)।

http://requirejs.org/

http://requirejs.org/docs/whyamd.html

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


1

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

function loadFiles(files, fn) {
    if (!files.length) {
        files = [];
    }
    var head = document.head || document.getElementsByTagName('head')[0];

    function loadFile(index) {
        if (files.length > index) {
            var fileref = document.createElement('script');
            fileref.setAttribute("type", "text/javascript");
            fileref.setAttribute("src", files[index]);
            head.appendChild(fileref);
            index = index + 1;
            // Used to call a callback function
            fileref.onload = function () {
                loadFile(index);
            }
        } else if(fn){
            fn();
        }
    }
    loadFile(0);
}

এটি ক্রমযুক্ত ফাইলগুলি লোড করার কারণে গ্রহণযোগ্য উত্তরের চেয়ে ভাল better যদি স্ক্রিপ্ট 2-এ স্ক্রিপ্ট 1 লোড করা দরকার হয় তবে ক্রমটি অর্ডার করা জরুরি।
সালমান এ

1

এটি আমার পক্ষে কাজ করে:

function getScripts(scripts) {
    var prArr = [];
    scripts.forEach(function(script) { 
        (function(script){
            prArr .push(new Promise(function(resolve){
                $.getScript(script, function () {
                    resolve();
                });
            }));
        })(script);
    });
    return Promise.all(prArr, function(){
        return true;
    });
}

এবং এটি ব্যবহার করুন:

var jsarr = ['script1.js','script2.js'];
getScripts(jsarr).then(function(){
...
});

1

এখানে ম্যাকিয়েজ সাউইকির একটির ব্যবহার এবং Promiseকলব্যাক হিসাবে বাস্তবায়ন করার উত্তর দেওয়া হল :

function loadScripts(urls, path) {
    return new Promise(function(resolve) {
        urls.forEach(function(src, i) {

            let script = document.createElement('script');        
            script.type = 'text/javascript';
            script.src = (path || "") + src;
            script.async = false;

            // If last script, bind the callback event to resolve
            if(i == urls.length-1) {                    
                // Multiple binding for browser compatibility
                script.onreadystatechange = resolve;
                script.onload = resolve;
            }

            // Fire the loading
            document.body.appendChild(script);
        });
    });
}

ব্যবহার করুন:

let JSDependencies = ["jquery.js",
                      "LibraryNeedingJquery.js",
                      "ParametersNeedingLibrary.js"];

loadScripts(JSDependencies,'JavaScript/').then(taskNeedingParameters);

সমস্ত জাভাস্ক্রিপ্ট ফাইলগুলি যত তাড়াতাড়ি সম্ভব ডাউনলোড করা হবে এবং প্রদত্ত ক্রমে কার্যকর করা হবে। তারপরে taskNeedingParametersবলা হয়।


0

উপরে অ্যান্ড্রু মার্ক নিউটনের বিস্তৃত উত্তরটির সংক্ষিপ্ত সংস্করণ। এইটি সাফল্যের জন্য স্থিতি কোডটি যাচাই করে না, যা আপনার অপরিজ্ঞাত UI আচরণ এড়ানোর জন্য করা উচিত।

এটি একটি বিরক্তিকর সিস্টেমের জন্য ছিল যেখানে আমি jQuery এর গ্যারান্টি দিতে পারি তবে অন্য কোনওটি অন্তর্ভুক্ত নয়, তাই আমি বাধ্য হয়ে যদি কোনও বাহ্যিক স্ক্রিপ্টের দিকে না ফেলা যায় তবে যথেষ্ট পরিমাণে এমন একটি কৌশল চাইছিলাম। (আপনি প্রথমে "পুনরাবৃত্ত" কলটিতে সূচকটি 0 দিয়ে পাস করে আরও ছোট করে তুলতে পারেন তবে স্টাইল অভ্যাসের জোর আমাকে চিনি যুক্ত করেছে))

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

if(typeof(__loaders) == 'undefined') __loaders = {};

if(typeof(__loaders.module1) == 'undefined')
{
    __loaders.module1 = false;

    var dependencies = [];

    dependencies.push('/scripts/loadmefirst.js');
    dependencies.push('/scripts/loadmenext.js');
    dependencies.push('/scripts/loadmelast.js');

    var getScriptChain  = function(chain, index)        
    {
        if(typeof(index) == 'undefined')
            index = 0;

        $.getScript(chain[index], 
            function()
            {
                if(index == chain.length - 1)
                {
                    __loaders.module1 = true;

                    /* !!!
                        Do your initialization of dependent stuff here 
                    !!! */
                }
                else 
                    getScriptChain(chain, index + 1);
            }
        );
    };

    getScriptChain(dependencies);       
}

0

এখানে একটি প্লাগইন রয়েছে যা jQuery এর getScript পদ্ধতি প্রসারিত করে। অ্যাসিনক্রোনাস এবং সিঙ্ক্রোনাস লোডিংয়ের জন্য অনুমতি দেয় এবং jQuery এর ক্যাচিং প্রক্রিয়া ব্যবহার করে। সম্পূর্ণ প্রকাশ, আমি এটি লিখেছি। আপনি যদি আরও ভাল পদ্ধতি খুঁজে পান তবে অবদান রাখতে নির্দ্বিধায় দয়া করে।

https://github.com/hudsonfoo/jquery-getscripts


0

লোড এন স্ক্রিপ্ট একের পর এক (যদি উপকারী হয় উদাহরণস্বরূপ 2nd ফাইলের জন্য 1 ম এক প্রয়োজন):

(function self(a,cb,i){
    i = i || 0; 
    cb = cb || function(){};    
    if(i==a.length)return cb();
    $.getScript(a[i++],self.bind(0,a,cb,i));                    
})(['list','of','script','urls'],function(){console.log('done')});

0

উপরের @ অ্যাডেনিওর উত্তরের ভিত্তিতে: সিএসএস এবং জেএসএস ফাইল দুটি লোডের সংমিশ্রণ

উন্নতির জন্য কোন পরামর্শ ??

// Usage
//$.getMultiResources(['script-1.js','style-1.css'], 'assets/somePath/')
//  .done(function () {})
//  .fail(function (error) {})
//  .always(function () {});

(function ($) {
  $.getMultiResources = function (arr, pathOptional, cache) {
    cache = (typeof cache === 'undefined') ? true : cache;
    var _arr = $.map(arr, function (src) {
      var srcpath = (pathOptional || '') + src;
      if (/.css$/i.test(srcpath)) {
        return $.ajax({
          type: 'GET',
          url: srcpath,
          dataType: 'text',
          cache: cache,
          success: function () {
            $('<link>', {
              rel: 'stylesheet',
              type: 'text/css',
              'href': srcpath
            }).appendTo('head');
          }
        });

      } else {
        return $.ajax({
          type: 'GET',
          url: srcpath,
          dataType: 'script',
          cache: cache
        });
      }
    });
    //
    _arr.push($.Deferred(function (deferred) {
      $(deferred.resolve);
    }));
    //
    return $.when.apply($, _arr);
  };
})(jQuery);

0

পুনরাবৃত্তি ব্যবহার করে আপনি এটি ব্যবহার করে দেখতে পারেন। এটি পুরো তালিকাটি ডাউনলোড করা শেষ না হওয়া পর্যন্ত এটি একের পর এক সিঙ্কে ডাউনলোড করবে।

var queue = ['url/links/go/here'];

ProcessScripts(function() { // All done do what ever you want

}, 0);

function ProcessScripts(cb, index) {
    getScript(queue[index], function() {
        index++;
        if (index === queue.length) { // Reached the end
            cb();
        } else {
            return ProcessScripts(cb, index);
        }
    });
}

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