গতিশীলভাবে একটি জাভাস্ক্রিপ্ট ফাইল লোড করুন


167

আপনি কীভাবে একটি জাভাস্ক্রিপ্ট ফাইল নির্ভরযোগ্যভাবে এবং গতিশীলভাবে লোড করতে পারেন? এটি একটি মডিউল বা উপাদান প্রয়োগ করতে ব্যবহার করা যেতে পারে যা যখন 'আরম্ভ করা হয়' তখন উপাদানটি প্রয়োজন অনুসারে প্রয়োজনীয় সমস্ত জাভাস্ক্রিপ্ট লাইব্রেরি স্ক্রিপ্টগুলি গতিশীলভাবে লোড করবে।

উপাদানটি ব্যবহার করে এমন ক্লায়েন্টকে সমস্ত লাইব্রেরি স্ক্রিপ্ট ফাইলগুলি লোড করার প্রয়োজন হয় না (এবং ম্যানুয়ালি <script>ট্যাগগুলি তাদের ওয়েব পৃষ্ঠায় সন্নিবেশ করা হয়) যা এই উপাদানটি প্রয়োগ করে - কেবলমাত্র 'মূল' উপাদান উপাদান স্ক্রিপ্ট ফাইল।

মূলধারার জাভাস্ক্রিপ্ট লাইব্রেরিগুলি কীভাবে এটি সম্পাদন করে (প্রোটোটাইপ, jQuery, ইত্যাদি)? এই সরঞ্জামগুলি কি একাধিক জাভাস্ক্রিপ্ট ফাইলগুলিকে স্ক্রিপ্ট ফাইলের একক পুনরায় বিতরণযোগ্য 'বিল্ড' সংস্করণে মার্জ করে? অথবা তারা আনুষঙ্গিক 'লাইব্রেরি' স্ক্রিপ্টগুলির কোনও গতিশীল লোড করে?

এই প্রশ্নের একটি সংযোজন: গতিশীলভাবে অন্তর্ভুক্ত জাভাস্ক্রিপ্ট ফাইলটি লোড হওয়ার পরে ইভেন্টটি পরিচালনা করার কোনও উপায় আছে কি? প্রোটোটাইপটিতে document.observeনথি-বিস্তৃত ইভেন্টগুলির জন্য রয়েছে। উদাহরণ:

document.observe("dom:loaded", function() {
  // initially hide all containers for tab content
  $$('div.tabcontent').invoke('hide');
});

স্ক্রিপ্ট উপাদানটির জন্য উপলভ্য ইভেন্টগুলি কী কী?


উত্তর:


84

আপনি ডায়নামিক স্ক্রিপ্ট ট্যাগ লিখতে পারেন ( প্রোটোটাইপ ব্যবহার করে ):

new Element("script", {src: "myBigCodeLibrary.js", type: "text/javascript"});

এখানে সমস্যাটি হ'ল আমরা জানি না কখন বাহ্যিক স্ক্রিপ্ট ফাইলটি সম্পূর্ণ লোড হয়।

আমরা প্রায়শই পরের লাইনে আমাদের নির্ভর কোডটি চাই এবং এমন কিছু লিখতে চাই:

if (iNeedSomeMore) {
    Script.load("myBigCodeLibrary.js"); // includes code for myFancyMethod();
    myFancyMethod(); // cool, no need for callbacks!
}

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

আপনি যদি স্ক্রিপ্টের প্রোটোটাইপ ব্যবহার করেন load

var Script = {
    _loadedScripts: [],
    include: function(script) {
        // include script only once
        if (this._loadedScripts.include(script)) {
            return false;
        }
        // request file synchronous
        var code = new Ajax.Request(script, {
            asynchronous: false,
            method: "GET",
            evalJS: false,
            evalJSON: false
        }).transport.responseText;
        // eval code on global level
        if (Prototype.Browser.IE) {
            window.execScript(code);
        } else if (Prototype.Browser.WebKit) {
            $$("head").first().insert(Object.extend(
                new Element("script", {
                    type: "text/javascript"
                }), {
                    text: code
                }
            ));
        } else {
            window.eval(code);
        }
        // remember included script
        this._loadedScripts.push(script);
    }
};

ক্রস-ডোমেনের জন্য এটি কাজ করতে আমি কী করতে পারি? (স্ক্রিপ্টটি লোড করা হচ্ছে http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu‌​ff/userjs/aagmfunctions.js)
ব্যবহারকারী 2284570


@ সাইস্তোপিকার্জ: আমি নিয়ন্ত্রণ করি না web.archive.org
ব্যবহারকারী 2284570

তারপরে আপনাকে অন্য কোনও প্রোগ্রাম ব্যবহার করে অ্যাক্সেস করতে চান এমন ডেটা স্ক্র্যাপ করতে হবে এবং এটি নিজের কাছে সরবরাহ করতে হবে
ডেভিড শুমান

আজাক্স কী? জিজ্ঞাসা ??
নীলজাইকে

72

জাভাস্ক্রিপ্টে আমদানি / অন্তর্ভুক্ত / প্রয়োজনীয়তা নেই তবে আপনি যা চান তা অর্জনের দুটি প্রধান উপায় রয়েছে:

1 - আপনি এজেএক্স কল দিয়ে এটিকে লোড করতে পারেন তারপর ইওল ব্যবহার করুন use

এটি সর্বাধিক সরলতম উপায় তবে জাভাস্ক্রিপ্ট সুরক্ষা সেটিংসের কারণে এটি আপনার ডোমেনের মধ্যে সীমাবদ্ধ and

2 - এইচটিএমএলে স্ক্রিপ্ট URL সহ একটি স্ক্রিপ্ট ট্যাগ যুক্ত করুন।

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

এই উভয় সমাধান এখানে আলোচনা এবং চিত্রিত হয়।

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

এর অর্থ হ'ল আপনি যদি এই কৌশলগুলি সরাসরি ব্যবহার করেন তবে আপনি আপনার নতুন বোঝা কোডটি পরবর্তী পংক্তিটি বোঝাতে বলার পরে ব্যবহার করতে পারবেন না, কারণ এটি এখনও লোড হবে।

EG: my_lovely_script.js এ মাইসুপারঅবজেক্ট রয়েছে

var js = document.createElement("script");

js.type = "text/javascript";
js.src = jsFilePath;

document.body.appendChild(js);

var s = new MySuperObject();

Error : MySuperObject is undefined

তারপরে আপনি পৃষ্ঠাটি এফ 5 টি পুনরায় লোড করুন। এবং এটি কাজ করে! বিভ্রান্তিকর ...

তাই এটা সম্পর্কে কি করতে হবে ?

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

function loadScript(url, callback)
{
    // adding the script tag to the head as suggested before
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = url;

   // then bind the event to the callback function 
   // there are several events for cross browser compatibility
   script.onreadystatechange = callback;
   script.onload = callback;

   // fire the loading
   head.appendChild(script);
}

তারপরে আপনি যে কোডটি ব্যবহার করতে চান তার পরে স্ক্রিপ্টটি লম্বা ফাংশনে লোড হওয়ার পরে লিখতে পারেন:

var myPrettyCode = function() {
    // here, do what ever you want
};

তারপরে আপনি এই সমস্ত চালান:

loadScript("my_lovely_script.js", myPrettyCode);

ঠিক আছে, আমি বুঝতে পেরেছি. তবে এই সমস্ত জিনিস লিখতে কষ্ট হচ্ছে।

ভাল, সেই ক্ষেত্রে, আপনি সর্বদা হিসাবে দুর্দান্ত ফ্রি jQuery কাঠামো ব্যবহার করতে পারেন, যা আপনাকে একই লাইনে এক লাইনে করতে দেয়:

$.getScript("my_lovely_script.js", function() {
    alert("Script loaded and executed.");
    // here you can use anything you defined in the loaded script
});

11
এই উত্তরটি কতটা আন্ডাররেটেড তা বিশ্বাস করতে পারে না। ধন্যবাদ.
নাফটালিমিচ

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

এইটা কাজ করে. আমি আশা করি আমার অভিজ্ঞতা এখানে ভাগ করে নেওয়া আপনার সময় সাশ্রয় করে কারণ আমি এটিতে বেশ কয়েক ঘন্টা ব্যয় করেছি। আমি কৌণিক 6 এবং প্রয়োগ টেম্পলেট ব্যবহার করছি (এইচটিএমএল, সিএসএস, জ্যাকোয়ারি) সমস্যাটি হল টেমপ্লেটে একটি জেএস ফাইল রয়েছে যা শ্রোতার ইভেন্টগুলি সংযুক্ত করতে এইচটিএমএল উপাদানগুলি লোড হওয়ার পরে লোড হয়। কৌনিক অ্যাপ্লিকেশনটি লোড হওয়ার পরে যে জেএস ফাইলটি কার্যকর করা শক্ত ছিল। এটি কৌণিক অ্যাপে (অ্যাঙ্গুলার.জসন) স্ক্রিপ্ট ট্যাগে যুক্ত করা এগুলি বান্ডিল করবে তবে লোড হওয়ার পরে সেই জেএস ফাইলটি কার্যকর করবে না। টাইপস্ক্রিপ্টে পুনরায় লেখার জন্য এটি অনেক বেশি কোড তাই এটি দুর্দান্ত সাহায্য। পরবর্তী মন্তব্য আমি মন্তব্যের দৈর্ঘ্যের কারণে উদাহরণটি রেখে দেব
নূর লাব্বিদি

আমি এই কোডটি কেবল অনুসরণ হিসাবে ব্যবহার করেছি: এনজিএফটারভিউআইনিট () {ডিবাগার; get।।। }
নূর লাব্বিদি

: কৌণিক আমি '$' এই অনুসৃত stackoverflow.com/questions/32050645/...
নুর Lababidi

28

আমি সম্প্রতি jQuery এর সাথে অনেক কম জটিল সংস্করণ ব্যবহার করেছি :

<script src="scripts/jquery.js"></script>
<script>
  var js = ["scripts/jquery.dimensions.js", "scripts/shadedborder.js", "scripts/jqmodal.js", "scripts/main.js"];
  var $head = $("head");
  for (var i = 0; i < js.length; i++) {
    $head.append("<script src=\"" + js[i] + "\"></scr" + "ipt>");
  }
</script>

আমি এটি পরীক্ষিত প্রতিটি ব্রাউজারে এটি দুর্দান্ত কাজ করেছে: আই 6/7, ফায়ারফক্স, সাফারি, অপেরা।

আপডেট: jQuery- কম সংস্করণ:

<script>
  var js = ["scripts/jquery.dimensions.js", "scripts/shadedborder.js", "scripts/jqmodal.js", "scripts/main.js"];
  for (var i = 0, l = js.length; i < l; i++) {
    document.getElementsByTagName("head")[0].innerHTML += ("<script src=\"" + js[i] + "\"></scr" + "ipt>");
  }
</script>

25
এটি দুর্দান্ত ... যদি না আপনি jquery লোড করার চেষ্টা করছেন।

1
দেখে মনে হচ্ছে যে jQuery ভবিষ্যতের রিলিজের জন্য প্রয়োজনীয় প্লাগইনটিকে jQuery কোরে রোল করতে চলেছে: প্লাগইনস.জকোয়ারি
অ্যাডাম

1
JQuery ব্যবহার করার আরও একটি ভাল উপায় হ'ল ব্যবহার করা $.getScript। আমার উত্তর দেখুন।
মুহাদ

1
আধুনিকীকরণ (yepnope.js) বা ল্যাব.জেগুলি এর জন্য উপযুক্ত সমাধান। ভারী স্ক্রিপ্ট লাইব্রেরি (যা প্রথমে লোড করা আবশ্যক) ব্যবহার করা মোবাইল বা অন্য অনেক পরিস্থিতিতে সর্বাধিক উপযুক্ত উত্তর নয়।
1nfiniti

2
@ মৌলিকগঙ্গানির পুরানো ব্রাউজারগুলি এবং এইচটিএমএল যাচাইকারীরা স্ক্রিপ্টটি শেষ করার লক্ষণ হিসাবে এটি ব্যাখ্যা করবে।
ট্র্যাভিস

20

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

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

function include( url, type ){
    // First make sure it hasn't been loaded by something else.
    if( Array.contains( includedFile, url ) )
        return;

    // Determine the MIME-type
    var jsExpr = new RegExp( "js$", "i" );
    var cssExpr = new RegExp( "css$", "i" );
    if( type == null )
        if( jsExpr.test( url ) )
            type = 'text/javascript';
        else if( cssExpr.test( url ) )
            type = 'text/css';

    // Create the appropriate element.
    var tag = null;
    switch( type ){
        case 'text/javascript' :
            tag = document.createElement( 'script' );
            tag.type = type;
            tag.src = url;
            break;
        case 'text/css' :
            tag = document.createElement( 'link' );
            tag.rel = 'stylesheet';
            tag.type = type;
            tag.href = url;
            break;
    }

    // Insert it to the <head> and the array to ensure it is not
    // loaded again.
    document.getElementsByTagName("head")[0].appendChild( tag );
    Array.add( includedFile, url );
}

এই পিকলের চেয়ে বেশি প্রসঙ্গ না থাকলে আমি ভয় করি যে আমার কোনও পরামর্শ নেই don't উপরের কোডটি যেমন রয়েছে তেমন কাজ করে, এটি কোনও কার্যকর প্রকল্প থেকে সরাসরি টানা হয়েছিল।
পালেহর্স

5
@ পেলেহর্স, মাইক এবং মুহদ ঠিক আছে, এটি আপনার প্রকল্পে কাজ করতে পারে তবে এটি আপনার প্রকল্পের "অন্তর্ভুক্ত ফাইল" এবং "অ্যারে" ভেরিয়েবলগুলি অন্য কোথাও সংজ্ঞায়িত করা উচিত, এটি নিজস্ব কোডটি চলবে না, এটি হতে পারে এটিকে সম্পাদনা করা আরও ভাল যাতে এটি আপনার প্রকল্পের প্রেক্ষাপটের বাইরে কাজ করতে পারে, বা কমপক্ষে একটি
অপ্রকাশিত

14

আর একটি দুর্দান্ত উত্তর

$.getScript("my_lovely_script.js", function(){


   alert("Script loaded and executed.");
  // here you can use anything you defined in the loaded script

 });

https://stackoverflow.com/a/950146/671046


2
ক্রস-ডোমেনের জন্য এটি কাজ করতে আমি কী করতে পারি? (স্ক্রিপ্টটি লোড করা হচ্ছে http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu‌​ff/userjs/aagmfunctions.js)
ব্যবহারকারী 2284570

9

আমি এখানে কিছু উদাহরণ কোড পেয়েছি ... কারও কি আরও ভাল উপায় আছে?

  function include(url)
  {
    var s = document.createElement("script");
    s.setAttribute("type", "text/javascript");
    s.setAttribute("src", url);
    var nodes = document.getElementsByTagName("*");
    var node = nodes[nodes.length -1].parentNode;
    node.appendChild(s);
  }

ক্রস-ডোমেনের জন্য এটি কাজ করতে আমি কী করতে পারি? (স্ক্রিপ্টটি লোড করা হচ্ছে http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu‌​ff/userjs/aagmfunctions.js)
ব্যবহারকারী 2284570

6

আপনার যদি ইতিমধ্যে jQuery লোড করা থাকে তবে আপনার $ .getScript ব্যবহার করা উচিত ।

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


4

আপনি যদি একটি SYNC স্ক্রিপ্ট লোড করতে চান , আপনাকে সরাসরি এইচটিএমএল হেড ট্যাগে স্ক্রিপ্ট পাঠ্য যুক্ত করতে হবে। এটি হিসাবে যুক্ত করা কোনও ASYNC লোডকে ট্রিগার করবে । বাহ্যিক ফাইল থেকে স্ক্রিপ্ট পাঠ্য সমকালীনভাবে লোড করতে, এক্সএইচআর ব্যবহার করুন। দ্রুত নমুনার নীচে (এটি অন্যান্য এবং অন্যান্য পোস্টের উত্তরগুলির অংশগুলি ব্যবহার করছে):

/*sample requires an additional method for array prototype:*/

if (Array.prototype.contains === undefined) {
Array.prototype.contains = function (obj) {
    var i = this.length;
    while (i--) { if (this[i] === obj) return true; }
    return false;
};
};

/*define object that will wrap our logic*/
var ScriptLoader = {
LoadedFiles: [],

LoadFile: function (url) {
    var self = this;
    if (this.LoadedFiles.contains(url)) return;

    var xhr = new XMLHttpRequest();
    xhr.onload = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                self.LoadedFiles.push(url);
                self.AddScript(xhr.responseText);
            } else {
                if (console) console.error(xhr.statusText);
            }
        }
    };
    xhr.open("GET", url, false);/*last parameter defines if call is async or not*/
    xhr.send(null);
},

AddScript: function (code) {
    var oNew = document.createElement("script");
    oNew.type = "text/javascript";
    oNew.textContent = code;
    document.getElementsByTagName("head")[0].appendChild(oNew);
}
};

/*Load script file. ScriptLoader will check if you try to load a file that has already been loaded (this check might be better, but I'm lazy).*/

ScriptLoader.LoadFile("Scripts/jquery-2.0.1.min.js");
ScriptLoader.LoadFile("Scripts/jquery-2.0.1.min.js");
/*this will be executed right after upper lines. It requires jquery to execute. It requires a HTML input with id "tb1"*/
$(function () { alert($('#tb1').val()); });

3

কারও কি আরও ভাল উপায় আছে?

আমার মনে হয় কেবল স্ক্রিপ্টটি শরীরে যুক্ত করা পৃষ্ঠার শেষ নোডে যুক্ত করা আরও সহজ হবে। এটি সম্পর্কে:

function include(url) {
  var s = document.createElement("script");
  s.setAttribute("type", "text/javascript");
  s.setAttribute("src", url);
  document.body.appendChild(s);
}

ক্রস-ডোমেনের জন্য এটি কাজ করতে আমি কী করতে পারি? (স্ক্রিপ্টটি লোড করা হচ্ছে http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu‌​ff/userjs/aagmfunctions.js)
ব্যবহারকারীর 2284570

3

আমি নেটটিতে খুঁজে পেয়েছি এমন আরও একটি সমাধান আমি ব্যবহার করেছি ... এটি ক্রিয়েটিভ কমনের অধীনে এবং এটি পরীক্ষা করে যে ফাংশনটি বলার আগে উত্সটি অন্তর্ভুক্ত করা হয়েছিল ...

আপনি ফাইলটি এখানে খুঁজে পেতে পারেন: સમાવેશ.js s

/** include - including .js files from JS - bfults@gmail.com - 2005-02-09
 ** Code licensed under Creative Commons Attribution-ShareAlike License 
 ** http://creativecommons.org/licenses/by-sa/2.0/
 **/              
var hIncludes = null;
function include(sURI)
{   
  if (document.getElementsByTagName)
  {   
    if (!hIncludes)
    {
      hIncludes = {}; 
      var cScripts = document.getElementsByTagName("script");
      for (var i=0,len=cScripts.length; i < len; i++)
        if (cScripts[i].src) hIncludes[cScripts[i].src] = true;
    }
    if (!hIncludes[sURI])
    {
      var oNew = document.createElement("script");
      oNew.type = "text/javascript";
      oNew.src = sURI;
      hIncludes[sURI]=true;
      document.getElementsByTagName("head")[0].appendChild(oNew);
    }
  }   
} 

ক্রস-ডোমেনের জন্য এটি কাজ করতে আমি কী করতে পারি? (স্ক্রিপ্টটি লোড করা হচ্ছে http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu‌​ff/userjs/aagmfunctions.js)
ব্যবহারকারী 2284570

3

YUI 3 এর একটি দুর্দান্ত বৈশিষ্ট্য সম্পর্কে সবেমাত্র সন্ধান পেয়েছি (পূর্বরূপে প্রকাশে উপলব্ধ লেখার সময়)। আপনি খুব বেশি কোড ছাড়াই YUI গ্রন্থাগারগুলিতে এবং "বাহ্যিক" মডিউলগুলিতে (আপনি যা সন্ধান করছেন) সহজেই নির্ভরতা sertোকাতে পারেন: YUI লোডার

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

উদাহরণ:

YUI({
    modules: {
        'simple': {
            fullpath: "http://example.com/public/js/simple.js"
        },
        'complicated': {
            fullpath: "http://example.com/public/js/complicated.js"
            requires: ['simple']  // <-- dependency to 'simple' module
        }
    },
    timeout: 10000
}).use('complicated', function(Y, result) {
    // called as soon as 'complicated' is loaded
    if (!result.success) {
        // loading failed, or timeout
        handleError(result.msg);
    } else {
        // call a function that needs 'complicated'
        doSomethingComplicated(...);
    }
});

আমার জন্য নিখুঁতভাবে কাজ করেছেন এবং নির্ভরতা পরিচালনার সুবিধা রয়েছে। YUI 2 ক্যালেন্ডারের সাথে উদাহরণের জন্য YUI ডকুমেন্টেশন দেখুন ।


YUI কেবল এই কার্যকারিতার জন্য অশ্লীলভাবে বড় হওয়া ব্যতীত এটি সম্ভবত আদর্শ।
মুহাদ

3

ডায়নামিক আমদানি নামে একটি নতুন প্রস্তাবিত ইসিএমএ স্ট্যান্ডার্ড রয়েছে , এটি সম্প্রতি ক্রোম এবং সাফারিতে অন্তর্ভুক্ত।

const moduleSpecifier = './dir/someModule.js';

import(moduleSpecifier)
   .then(someModule => someModule.foo()); // executes foo method in someModule

2

আমরা কার্যক্ষেত্রে যে কৌশলটি ব্যবহার করি তা হ'ল জাভাস্ক্রিপ্ট ফাইলটিকে একটি এজেএক্স অনুরোধ ব্যবহার করে অনুরোধ করা এবং তারপরে রিটার্নটি স্পষ্ট করা ()। আপনি যদি প্রোটোটাইপ লাইব্রেরি ব্যবহার করেন তবে তারা তাদের কার্যকারিতাটি তাদের আজাক্স.আরউকেস্ট কলটিতে সমর্থন করে।


2

jquery এর .append () ফাংশনটি দিয়ে আমার জন্য এটি সমাধান করেছে - এটি সম্পূর্ণ jquery ui প্যাকেজ লোড করতে ব্যবহার করে

/*
 * FILENAME : project.library.js
 * USAGE    : loads any javascript library
 */
    var dirPath = "../js/";
    var library = ["functions.js","swfobject.js","jquery.jeditable.mini.js","jquery-ui-1.8.8.custom.min.js","ui/jquery.ui.core.min.js","ui/jquery.ui.widget.min.js","ui/jquery.ui.position.min.js","ui/jquery.ui.button.min.js","ui/jquery.ui.mouse.min.js","ui/jquery.ui.dialog.min.js","ui/jquery.effects.core.min.js","ui/jquery.effects.blind.min.js","ui/jquery.effects.fade.min.js","ui/jquery.effects.slide.min.js","ui/jquery.effects.transfer.min.js"];

    for(var script in library){
        $('head').append('<script type="text/javascript" src="' + dirPath + library[script] + '"></script>');
    }

ব্যবহার করার জন্য - আপনি jquery.js আমদানির পরে আপনার এইচটিএমএল / পিএইচপি / ইত্যাদির শিরোনামে আপনার লাইব্রেরির পুরোটা এটির মাথায় যুক্ত করে লোড করার জন্য আপনি কেবল এই একটি ফাইল অন্তর্ভুক্ত করবেন ...

<script type="text/javascript" src="project.library.js"></script>

2

এটি সুন্দর, সংক্ষিপ্ত, সাধারণ এবং রক্ষণাবেক্ষণযোগ্য রাখুন! :]

// 3rd party plugins / script (don't forget the full path is necessary)
var FULL_PATH = '', s =
[
    FULL_PATH + 'plugins/script.js'      // Script example
    FULL_PATH + 'plugins/jquery.1.2.js', // jQuery Library 
    FULL_PATH + 'plugins/crypto-js/hmac-sha1.js',      // CryptoJS
    FULL_PATH + 'plugins/crypto-js/enc-base64-min.js'  // CryptoJS
];

function load(url)
{
    var ajax = new XMLHttpRequest();
    ajax.open('GET', url, false);
    ajax.onreadystatechange = function ()
    {
        var script = ajax.response || ajax.responseText;
        if (ajax.readyState === 4)
        {
            switch(ajax.status)
            {
                case 200:
                    eval.apply( window, [script] );
                    console.log("library loaded: ", url);
                    break;
                default:
                    console.log("ERROR: library not loaded: ", url);
            }
        }
    };
    ajax.send(null);
}

 // initialize a single load 
load('plugins/script.js');

// initialize a full load of scripts
if (s.length > 0)
{
    for (i = 0; i < s.length; i++)
    {
        load(s[i]);
    }
}

এই কোডটি কেবল একটি সংক্ষিপ্ত কার্যকরী উদাহরণ যা কোনও (বা প্রদত্ত) প্ল্যাটফর্মের পুরো সমর্থনের জন্য অতিরিক্ত বৈশিষ্ট্য কার্যকারিতা প্রয়োজন হতে পারে


2

গতিশীল মডিউল আমদানি ফায়ারফক্স 67+ এ অবতরণ করেছে

(async () => {
   await import('./synth/BubbleSynth.js')
})()

ত্রুটি পরিচালনার সাথে:

(async () => {
    await import('./synth/BubbleSynth.js').catch((error) => console.log('Loading failed' + error))
})()

এটি যে কোনও ধরণের অ-মডিউল লাইব্রেরিগুলির জন্যও কাজ করে, এক্ষেত্রে lib উইন্ডো অবজেক্টে পাওয়া যায়, পুরানো উপায়ে, তবে কেবল চাহিদা অনুযায়ী, যা দুর্দান্ত is

Suncalc.js ব্যবহার করে উদাহরণস্বরূপ , এইভাবে কাজ করতে সার্ভারের অবশ্যই CORS সক্ষম থাকতে হবে !

(async () => {
 await import('https://cdnjs.cloudflare.com/ajax/libs/suncalc/1.8.0/suncalc.min.js')
 .then(function(){
   let times = SunCalc.getTimes(new Date(), 51.5,-0.1);
   console.log("Golden Hour today in London: " + times.goldenHour.getHours() + ':' + times.sunrise.getMinutes() + ". Take your pics!")
  })
})()

https://caniuse.com/#feat=es6-module-dynamic-import


1

এমন স্ক্রিপ্ট রয়েছে যা এই উদ্দেশ্যে বিশেষভাবে ডিজাইন করা হয়েছে।

yepnope.js মডার্নিজর এবং ল্যাব.জেজে অন্তর্নির্মিত একটি আরও অনুকূলিত (তবে কম ব্যবহারকারী বান্ধব সংস্করণ)।

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


1

আমি একটি সাধারণ মডিউল লিখেছিলাম যা জাভাস্ক্রিপ্টে মডিউল স্ক্রিপ্টগুলি আমদানি / সহ স্বয়ংক্রিয়ভাবে কাজ করে। এটি ব্যবহার করে দেখুন এবং দয়া করে কিছু প্রতিক্রিয়া রাখুন! :) কোডটির বিশদ ব্যাখ্যার জন্য এই ব্লগ পোস্টটি দেখুন: http://stamat.wordpress.com/2013/04/12/ জাভাস্ক্রিপ্ট- প্রয়োজনীয়তা- আমদানি- অন্তর্ভুক্ত- মডুলস /

var _rmod = _rmod || {}; //require module namespace
_rmod.on_ready_fn_stack = [];
_rmod.libpath = '';
_rmod.imported = {};
_rmod.loading = {
    scripts: {},
    length: 0
};

_rmod.findScriptPath = function(script_name) {
    var script_elems = document.getElementsByTagName('script');
    for (var i = 0; i < script_elems.length; i++) {
        if (script_elems[i].src.endsWith(script_name)) {
            var href = window.location.href;
            href = href.substring(0, href.lastIndexOf('/'));
            var url = script_elems[i].src.substring(0, script_elems[i].length - script_name.length);
            return url.substring(href.length+1, url.length);
        }
    }
    return '';
};

_rmod.libpath = _rmod.findScriptPath('script.js'); //Path of your main script used to mark the root directory of your library, any library


_rmod.injectScript = function(script_name, uri, callback, prepare) {

    if(!prepare)
        prepare(script_name, uri);

    var script_elem = document.createElement('script');
    script_elem.type = 'text/javascript';
    script_elem.title = script_name;
    script_elem.src = uri;
    script_elem.async = true;
    script_elem.defer = false;

    if(!callback)
        script_elem.onload = function() {
            callback(script_name, uri);
        };

    document.getElementsByTagName('head')[0].appendChild(script_elem);
};

_rmod.requirePrepare = function(script_name, uri) {
    _rmod.loading.scripts[script_name] = uri;
    _rmod.loading.length++;
};

_rmod.requireCallback = function(script_name, uri) {
    _rmod.loading.length--;
    delete _rmod.loading.scripts[script_name];
    _rmod.imported[script_name] = uri;

    if(_rmod.loading.length == 0)
        _rmod.onReady();
};

_rmod.onReady = function() {
    if (!_rmod.LOADED) {
        for (var i = 0; i < _rmod.on_ready_fn_stack.length; i++){
            _rmod.on_ready_fn_stack[i]();
        });
        _rmod.LOADED = true;
    }
};

//you can rename based on your liking. I chose require, but it can be called include or anything else that is easy for you to remember or write, except import because it is reserved for future use.
var require = function(script_name) {
    var np = script_name.split('.');
    if (np[np.length-1] === '*') {
        np.pop();
        np.push('_all');
    }

    script_name = np.join('.');
    var uri = _rmod.libpath + np.join('/')+'.js';
    if (!_rmod.loading.scripts.hasOwnProperty(script_name) 
     && !_rmod.imported.hasOwnProperty(script_name)) {
        _rmod.injectScript(script_name, uri, 
            _rmod.requireCallback, 
                _rmod.requirePrepare);
    }
};

var ready = function(fn) {
    _rmod.on_ready_fn_stack.push(fn);
};

// ----- USAGE -----

require('ivar.util.array');
require('ivar.util.string');
require('ivar.net.*');

ready(function(){
    //do something when required scripts are loaded
});

1

আমি এই সমস্ত নমুনায় হারিয়ে গিয়েছি তবে আজ আমার প্রধান .js থেকে একটি বাহ্যিক .js লোড করা দরকার এবং আমি এটি করেছি:

document.write("<script src='https://www.google.com/recaptcha/api.js'></script>");

আপনি লিঙ্কটি একবার দেখে নিতে পারেন: উত্তর
asmmahmud

1

কলব্যাক এবং আইই সমর্থন সহ এখানে একটি সহজ:

function loadScript(url, callback) {

    var script = document.createElement("script")
    script.type = "text/javascript";

    if (script.readyState) { //IE
        script.onreadystatechange = function () {
            if (script.readyState == "loaded" || script.readyState == "complete") {
                script.onreadystatechange = null;
                callback();
            }
        };
    } else { //Others
        script.onload = function () {
            callback();
        };
    }

    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

loadScript("https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function () {

     //jQuery loaded
     console.log('jquery loaded');

});

1

আমি জানি আমার উত্তরটি এই প্রশ্নের জন্য কিছুটা দেরিতে হয়েছে, তবে, এখানে www.html5rocks.com- এর একটি দুর্দান্ত নিবন্ধ দেওয়া হয়েছে - স্ক্রিপ্ট লোডিংয়ের ন্যক্কারজনক জলে গভীর ডুব

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

আপনার চারটি স্ক্রিপ্টের নাম রেখে বিবেচনা করে আপনি 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') {
    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>');
  }
}

কয়েকটি কৌশল এবং মিনিফিকেশন পরে এটি 362 বাইট

!function(e,t,r){function n(){for(;d[0]&&"loaded"==d[0][f];)c=d.shift(),c[o]=!i.parentNode.insertBefore(c,i)}for(var s,a,c,d=[],i=e.scripts[0],o="onreadystatechange",f="readyState";s=r.shift();)a=e.createElement(t),"async"in i?(a.async=!1,e.head.appendChild(a)):i[f]?(d.push(a),a[o]=n):e.write("<"+t+' src="'+s+'" defer></'+t+">"),a.src=s}(document,"script",[
  "//other-domain.com/1.js",
  "2.js"
])

আমি উপরোক্ত পদ্ধতির ব্যবহার করছি এটি ক্রোম এবং ফায়ারফক্সে ঠিকঠাক কাজ করছে তবে IE ব্রাউজারে সমস্যার মুখোমুখি হচ্ছেন
মিঃ রোশান

1

এটার মতো কিছু...

<script>
     $(document).ready(function() {
          $('body').append('<script src="https://maps.googleapis.com/maps/api/js?key=KEY&libraries=places&callback=getCurrentPickupLocation" async defer><\/script>');
     });
</script>

1

এখানে জেএস ফাইলগুলি লোড করার জন্য একটি ফাংশনের সাধারণ উদাহরণ। প্রাসঙ্গিক বিষয়:

  • আপনার jQuery দরকার নেই, তাই আপনি jQuery.js ফাইলটি লোড করতে প্রাথমিকভাবে এটি ব্যবহার করতে পারেন
  • এটি কলব্যাক সহ অ্যাসিঙ্ক
  • এটি কেবল একবারে লোড হওয়া নিশ্চিত করে, কারণ এটি লোড হওয়া ইউআরএলগুলির রেকর্ড সহ একটি ঘের রাখে, সুতরাং নেটওয়ার্কের ব্যবহার এড়ানো যায় না
  • jQuery এর বিপরীতে $.ajaxবা $.getScriptআপনি নোটেস ব্যবহার করতে পারেন, সিএসপিতে এইভাবে সমস্যাগুলি সমাধান করে unsafe-inline। শুধু সম্পত্তি ব্যবহার করুনscript.nonce
var getScriptOnce = function() {

    var scriptArray = []; //array of urls (closure)

    //function to defer loading of script
    return function (url, callback){
        //the array doesn't have such url
        if (scriptArray.indexOf(url) === -1){

            var script=document.createElement('script');
            script.src=url;
            var head=document.getElementsByTagName('head')[0],
                done=false;

            script.onload=script.onreadystatechange = function(){
                if ( !done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete') ) {
                    done=true;
                    if (typeof callback === 'function') {
                        callback();
                    }
                    script.onload = script.onreadystatechange = null;
                    head.removeChild(script);

                    scriptArray.push(url);
                }
            };

            head.appendChild(script);
        }
    };
}();

এখন আপনি এটি সহজভাবে ব্যবহার করুন

getScriptOnce("url_of_your_JS_file.js");

1

একটি অযৌক্তিক ওয়ান-লাইনার, যারা মনে করেন যে জেএস লাইব্রেরি লোড করা উচিত কোডের এক লাইনের বেশি নেওয়া উচিত নয়: পি

await new Promise((resolve, reject) => {let js = document.createElement("script"); js.src="mylibrary.js"; js.onload=resolve; js.onerror=reject; document.body.appendChild(js)});

অবশ্যই আপনি যে স্ক্রিপ্টটি আমদানি করতে চান তা যদি মডিউল হয় তবে আপনি import(...)ফাংশনটি ব্যবহার করতে পারেন ।


1

প্রতিশ্রুতি দিয়ে আপনি এটি সহজতর করতে পারেন। লোডার ফাংশন:

  const loadCDN = src =>
    new Promise((resolve, reject) => {
      if (document.querySelector(`head > script[src="${src}"]`) !== null) return resolve()
      const script = document.createElement("script")
      script.src = src
      script.async = true
      document.head.appendChild(script)
      script.onload = resolve
      script.onerror = reject
    })

ব্যবহার (async / অপেক্ষা):

await loadCDN("https://.../script.js")

ব্যবহার (প্রতিশ্রুতি):

loadCDN("https://.../script.js").then(res => {}).catch(err => {})

দ্রষ্টব্য: একটি অনুরূপ সমাধান ছিল তবে এটি স্ক্রিপ্টটি ইতিমধ্যে লোড হয়েছে কিনা এবং প্রতিবার স্ক্রিপ্টটি লোড করে কিনা তা পরীক্ষা করে না। এটি একটিতে src সম্পত্তি পরীক্ষা করে।


0

jscript, প্রোটোটাইপ, YUI এর মতো সমস্ত প্রধান জাভাস্ক্রিপ্ট লাইব্রেরিতে স্ক্রিপ্ট ফাইল লোড করার জন্য সমর্থন রয়েছে। উদাহরণস্বরূপ, ওয়াইউআইতে, কোরটি লোড করার পরে আপনি ক্যালেন্ডার নিয়ন্ত্রণ লোড করার জন্য নিম্নলিখিতটি করতে পারেন

var loader = new YAHOO.util.YUILoader({

    require: ['calendar'], // what components?

    base: '../../build/',//where do they live?

    //filter: "DEBUG",  //use debug versions (or apply some
                        //some other filter?

    //loadOptional: true, //load all optional dependencies?

    //onSuccess is the function that YUI Loader
    //should call when all components are successfully loaded.
    onSuccess: function() {
        //Once the YUI Calendar Control and dependencies are on
        //the page, we'll verify that our target container is 
        //available in the DOM and then instantiate a default
        //calendar into it:
        YAHOO.util.Event.onAvailable("calendar_container", function() {
            var myCal = new YAHOO.widget.Calendar("mycal_id", "calendar_container");
            myCal.render();
        })
     },

    // should a failure occur, the onFailure function will be executed
    onFailure: function(o) {
        alert("error: " + YAHOO.lang.dump(o));
    }

 });

// Calculate the dependency and insert the required scripts and css resources
// into the document
loader.insert();

আপনি লিঙ্কটি একবার দেখে নিতে পারেন: উত্তর
asmmahmud

0

আমি কাজের উদাহরণ সহ উপরের পোস্টটি কিছু টুইট করেছি। এখানে আমরা একই অ্যারেতে সিএসএস এবং জেএসও দিতে পারি।

$(document).ready(function(){

if (Array.prototype.contains === undefined) {
Array.prototype.contains = function (obj) {
    var i = this.length;
    while (i--) { if (this[i] === obj) return true; }
    return false;
};
};

/* define object that will wrap our logic */
var jsScriptCssLoader = {

jsExpr : new RegExp( "js$", "i" ),
cssExpr : new RegExp( "css$", "i" ),
loadedFiles: [],

loadFile: function (cssJsFileArray) {
    var self = this;
    // remove duplicates with in array
    cssJsFileArray.filter((item,index)=>cssJsFileArray.indexOf(item)==index)
    var loadedFileArray = this.loadedFiles;
    $.each(cssJsFileArray, function( index, url ) {
            // if multiple arrays are loaded the check the uniqueness
            if (loadedFileArray.contains(url)) return;
            if( self.jsExpr.test( url ) ){
                $.get(url, function(data) {
                    self.addScript(data);
                });

            }else if( self.cssExpr.test( url ) ){
                $.get(url, function(data) {
                    self.addCss(data);
                });
            }

            self.loadedFiles.push(url);
    });

    // don't load twice accross different arrays

},
addScript: function (code) {
    var oNew = document.createElement("script");
    oNew.type = "text/javascript";
    oNew.textContent = code;
    document.getElementsByTagName("head")[0].appendChild(oNew);
},
addCss: function (code) {
    var oNew = document.createElement("style");
    oNew.textContent = code;
    document.getElementsByTagName("head")[0].appendChild(oNew);
}

};


//jsScriptCssLoader.loadFile(["css/1.css","css/2.css","css/3.css"]);
jsScriptCssLoader.loadFile(["js/common/1.js","js/2.js","js/common/file/fileReader.js"]);
});

0

আপনারা যারা, এক-লাইনার ভালবাসেন:

import('./myscript.js');

সম্ভাবনা হ'ল আপনি যেমন একটি ত্রুটি পেতে পারেন:

এ স্ক্রিপ্ট ব্যবহার ' করুন: http //..../myscript.js মূল থেকে' ' http://127.0.0.1 ' CORS নীতি দ্বারা অবরোধ করা হয়েছে: না 'অ্যাকসেস-নিয়ন্ত্রণ-মঞ্জুর করুন বংশোদ্ভূত' হেডার উপস্থিত হয় অনুরোধ করা সংস্থান।

কোন ক্ষেত্রে, আপনি ফ্যালব্যাক করতে পারেন:

fetch('myscript.js').then(r => r.text()).then(t => new Function(t)());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.