ජාවාස්ක්‍රිප්ට් ගොනුවක් වෙනත් ජාවාස්ක්‍රිප්ට් ගොනුවකට ඇතුළත් කරන්නේ කෙසේද?


5196

@importවෙනත් ජාවාස්ක්‍රිප්ට් ගොනුවක් තුළ ජාවාස්ක්‍රිප්ට් ගොනුවක් ඇතුළත් කිරීමට ඔබට ඉඩ දෙන CSS හි සමාන යමක් ජාවාස්ක්‍රිප්ට් හි තිබේද?



82
An ඩැනියෙල්, මට AJAX ඇමතුමක් භාවිතා කිරීමට අවශ්‍ය නැත.
ඇලෙක් ස්මාර්ට්

13
ඇණවුම් කළ scriptටැග් භාවිතා කරමින් ආනයනය කරන ලද ගොනුව අවශ්‍ය අනෙක් ගොනුවට පෙර ප්‍රකාශ නොකරන්නේ ඇයි ?
falsarella

6
LaClaudiu එය කිසිවක් ආනයනය කිරීමට උපකාරී නොවේ , නමුත් එයද ක්‍රියාත්මක විය යුතුය. ඔබ සතුව වෙනත් JS ගොනුවක් මත රඳා පවතින JS ගොනුවක් තිබේ නම්, පළමුව පරායත්ත ලිපිගොනු වල ස්ක්‍රිප්ට් ටැග් ප්‍රකාශ කරන්න, එවිට පසුව එහි පරායත්තයන් පටවනු ලැබේ. ඔබට එය කළ නොහැකි ප්‍රවේශයක් තිබේ නම්, මෙහි පිළිතුරු ප්‍රයෝජනවත් විය යුතුය.
falsarella

1
මෙය කිරීමේ ප්‍රායෝගික වාසිය කුමක්ද? ජාවාස්ක්‍රිප්ට් ගොනුව මත යැපෙන කේත පදනම පූරණය නොවන අතර එය පටවා නොමැති ඕනෑම අවස්ථාවක වැඩ කිරීමට පටන් ගනී!
Ciasto piekarz

Answers:


4475

ජාවාස්ක්‍රිප්ට් හි පැරණි අනුවාදයන්ට ආනයනය කිරීම, ඇතුළත් කිරීම හෝ අවශ්‍යතාවයක් නොතිබුණි, එබැවින් මෙම ගැටළුව සඳහා විවිධ ප්‍රවේශයන් වර්ධනය කර ඇත.

නමුත් 2015 (ES6) සිට, ජාවා ස්ක්රිප්ට් තිබුනේ ES6 මොඩියුල ද සහයෝගය ද, Node.js ආනයන මොඩියුලයක් සම්මත බොහෝ නවීන බ්රවුසරයන් .

පැරණි බ්‍රව්සර් සමඟ අනුකූල වීම සඳහා, වෙබ් පැක් සහ රෝල්අප් වැනි මෙවලම් සහ / හෝ බාබෙල් වැනි පාරදෘශ්‍ය මෙවලම් සාදන්න භාවිතා කළ හැකිය.

ES6 මොඩියුල

ධජය සමඟ v8.5 සිට ECMAScript (ES6) මොඩියුලයන් Node.js හි සහය දක්වා ඇති අතර --experimental-modulesධජය නොමැතිව අවම වශයෙන් Node.js v13.8.0 සිට. "ESM" (එදිරිව Node.js මීට පෙර CommonJS ආකාරයේ මොඩියුලය පද්ධතිය [ "CJS"]) ඔබ එක්කෝ භාවිතා සක්රිය කිරීමට "type": "module"දී package.jsonහෝ ලබා දෙන දීර්ඝ ලිපි ගොණු .mjs. (ඒ හා සමානව, .cjsඔබේ පෙරනිමිය ESM නම් Node.js හි පෙර CJS මොඩියුලය සමඟ ලියා ඇති මොඩියුල නම් කළ හැකිය .)

භාවිතා කිරීම package.json:

{
    "type": "module"
}

ඉන්පසු module.js:

export function hello() {
  return "Hello";
}

ඉන්පසු main.js:

import { hello } from './module.js';
let val = hello();  // val is "Hello";

භාවිතා කරමින් .mjs, ඔබට ඇත්තේ module.mjs:

export function hello() {
  return "Hello";
}

ඉන්පසු main.mjs:

import { hello } from './module.mjs';
let val = hello();  // val is "Hello";

බ්‍රව්සර්වල ECMAScript මොඩියුල

වෙබ් බ්රව්සර සෘජුවම සම්මතයන් මොඩියුලයන් පැටවීම සඳහා සහයෝගය තිබුණා (Webpack වැනි කිසිදු ආයුධ හා උපකරණ) සිට සෆාරි 10.1, ක්රෝම් 61, ෆයර්ෆොක්ස් 60, සහ එජ් 16. දී වත්මන් සහාය පරීක්ෂා කරන්න caniuse . Node.js .mjsදිගුව භාවිතා කිරීමට අවශ්‍ය නැත ; මොඩියුල / ස්ක්‍රිප්ට් මත ගොනු දිගු කිරීම බ්‍රව්සර් සම්පූර්ණයෙන්ම නොසලකා හරියි.

<script type="module">
  import { hello } from './hello.mjs'; // Or it could be simply `hello.js`
  hello('world');
</script>
// hello.mjs -- or it could be simply `hello.js`
export function hello(text) {
  const div = document.createElement('div');
  div.textContent = `Hello ${text}`;
  document.body.appendChild(div);
}

වැඩිදුර කියවන්න https://jakearchibald.com/2017/es-modules-in-browsers/

බ්‍රව්සර්වල ගතික ආනයන

ගතික ආනයන මඟින් ස්ක්‍රිප්ටයට අවශ්‍ය පරිදි වෙනත් ස්ක්‍රිප්ට් පූරණය කිරීමට ඉඩ දෙයි:

<script type="module">
  import('hello.mjs').then(module => {
      module.hello('world');
    });
</script>

වැඩිදුර කියවන්න https://developers.google.com/web/updates/2017/11/dynamic-import

Node.js අවශ්‍යයි

පැරණි CJS මොඩියුල විලාසය, තවමත් Node.js හි බහුලව භාවිතා වේ, module.exports/require පද්ධතිය වේ.

// mymodule.js
module.exports = {
   hello: function() {
      return "Hello";
   }
}
// server.js
const myModule = require('./mymodule');
let val = myModule.hello(); // val is "Hello"   

පූර්ව සැකසුම් අවශ්‍ය නොවන බ්‍රව්සර්වල බාහිර ජාවාස්ක්‍රිප්ට් අන්තර්ගතයන් ඇතුළත් කිරීමට ජාවාස්ක්‍රිප්ට් සඳහා වෙනත් ක්‍රම තිබේ.

AJAX පැටවීම

ඔබට AJAX ඇමතුමකින් අමතර ස්ක්‍රිප්ටයක් පටවා evalඑය ක්‍රියාත්මක කිරීමට භාවිතා කළ හැකිය. මෙය වඩාත් සරලම ක්‍රමයයි, නමුත් එය ජාවාස්ක්‍රිප්ට් සෑන්ඩ්බොක්ස් ආරක්ෂක ආකෘතිය නිසා එය ඔබගේ වසමට සීමා වේ. භාවිතා කිරීමeval කිරීම දෝෂ, හක්ක සහ ආරක්ෂක ගැටළු සඳහා දොර විවර කරයි.

පැටවීම ලබා ගන්න

ෆයිච් ඉන්ජෙක්ට් පුස්තකාලය fetchභාවිතයෙන් ස්ක්‍රිප්ට් පරායත්තතාවයන් ක්‍රියාත්මක කිරීමේ අනුපිළිවෙල පාලනය කිරීම සඳහා පොරොන්දු භාවිතා කරමින් ඩයිනමික් ආනයන මෙන් ඔබට ඇමතුමක් සමඟ ස්ක්‍රිප්ට් එකක් හෝ කිහිපයක් පූරණය කළ හැකිය :

fetchInject([
  'https://cdn.jsdelivr.net/momentjs/2.17.1/moment.min.js'
]).then(() => {
  console.log(`Finish in less than ${moment().endOf('year').fromNow(true)}`)
})

jQuery පැටවීම

මෙම jQuery පුස්තකාල පැටවීම ක්රියාකාරිත්වය සපයයි එක් අනුකූලව :

$.getScript("my_lovely_script.js", function() {
   alert("Script loaded but not necessarily executed.");
});

ගතික ස්ක්‍රිප්ට් පූරණය

ඔබට ස්ක්‍රිප්ට් URL සමඟ ස්ක්‍රිප්ට් ටැග් එකක් HTML එකට එක් කළ හැකිය. JQuery හි පොදු කාර්ය වළක්වා ගැනීම සඳහා මෙය කදිම විසඳුමකි.

ස්ක්‍රිප්ටයට වෙනත් සේවාදායකයක වාසය කළ හැකිය. තවද, බ්‍රව්සරය කේතය ඇගයීමට ලක් කරයි. මෙම <script>වෙබ් පිටුව හෝ බවට ටැගය ඖෂධයක් එන්නත් කළ හැකි <head>, හෝ හුදෙක් අවසන් පෙර, ඇතුළු </body>ටැගය.

මෙය ක්‍රියාත්මක විය හැකි ආකාරය පිළිබඳ උදාහරණයක් මෙන්න:

function dynamicallyLoadScript(url) {
    var script = document.createElement("script");  // create a script DOM node
    script.src = url;  // set its src to the provided URL

    document.head.appendChild(script);  // add it to the end of the head section of the page (could change 'head' to 'body' to add it to the end of the body section instead)
}

මෙම ශ්‍රිතය <script>පිටුවේ ප්‍රධාන කොටසේ කෙළවරට නව ටැගයක් එක් කරයි , එහිදීsrc ගුණාංගය URL වෙත සකසා ඇති අතර එය පළමු පරාමිතිය ලෙස ශ්‍රිතයට ලබා දේ.

මෙම විසඳුම් දෙකම ජාවාස්ක්‍රිප්ට් පිස්සුව: ගතික ස්ක්‍රිප්ට් ලෝඩින් හි සාකච්ඡා කර නිදර්ශනය කර ඇත .

ස්ක්‍රිප්ට් ක්‍රියාත්මක වූ විට හඳුනා ගැනීම

දැන්, ඔබ දැනගත යුතු විශාල ප්‍රශ්නයක් තිබේ. එසේ කිරීමෙන් ඔබ කේතය දුරස්ථව පටවන බව අඟවයි . නවීන වෙබ් බ්‍රව්සර් මඟින් ගොනුව පටවා ඔබගේ වර්තමාන ස්ක්‍රිප්ට් එක දිගටම කරගෙන යනු ඇත. (මෙය jQuery ක්‍රමය සහ අතින් ගතික ස්ක්‍රිප්ට් පැටවීමේ ක්‍රමය යන දෙකටම අදාළ වේ.)

එයින් අදහස් වන්නේ ඔබ මෙම උපක්‍රම කෙලින්ම භාවිතා කරන්නේ නම්, ඔබ එය පටවන ලෙස ඉල්ලා සිටීමෙන් පසු ඊළඟ පේළියේ අලුතින් පටවන ලද කේතය භාවිතා කිරීමට ඔබට නොහැකි වනු ඇති බැවින් එය තවමත් පටවනු ලැබේ.

උදාහරණයක් ලෙස: my_lovely_script.jsඅඩංගු MySuperObject:

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

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

document.body.appendChild(js);

var s = new MySuperObject();

Error : MySuperObject is undefined

ඉන්පසු ඔබ පිටු පහර නැවත රීලෝඩ් කරන්න F5. එය ක්‍රියාත්මක වේ! අවුල් සහගත ...

ඉතින් ඒ ගැන කුමක් කළ යුතුද?

හොඳයි, මා ඔබට ලබා දුන් සබැඳියෙන් කතුවරයා යෝජනා කරන හැක් ඔබට භාවිතා කළ හැකිය. සාරාංශයක් ලෙස, කඩිමුඩියේ සිටින පුද්ගලයින් සඳහා, ස්ක්‍රිප්ට් පටවන විට ඔහු නැවත ඇමතුම් ශ්‍රිතයක් ක්‍රියාත්මක කිරීමට සිදුවීමක් භාවිතා කරයි. එබැවින් ඔබට දුරස්ථ පුස්තකාලය භාවිතයෙන් සියලුම කේත ඇමතුම් ලබා ගැනීමේ ශ්‍රිතයට ඇතුළත් කළ හැකිය. උදාහරණයක් වශයෙන්:

function loadScript(url, callback)
{
    // Adding the script tag to the head as suggested before
    var head = document.head;
    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 whatever you want
};

එවිට ඔබ ඒ සියල්ල ක්‍රියාත්මක කරයි:

loadScript("my_lovely_script.js", myPrettyCode);

ස්ක්‍රිප්ට් එක DOM පූරණය කිරීමෙන් පසුව හෝ ඊට පෙර බ්‍රව්සරය මත පදනම්ව සහ ඔබ රේඛාව ඇතුළත් කළේද යන්න සැලකිල්ලට ගන්න script.async = false;. එය තියෙනවා පොදුවේ ජාවාස්ක්රිප්ට් පැටවීම කැකිල්ලේ මහා මෙම සාකච්ඡා කරන.

ප්‍රභව කේතය ඒකාබද්ධ කිරීම / පෙර සැකසීම

මෙම පිළිතුරේ ඉහළින් සඳහන් කළ පරිදි, බොහෝ සංවර්ධකයින් ඔවුන්ගේ ව්‍යාපෘති වලදී පාර්සල්, වෙබ් පැක් හෝ බාබෙල් වැනි ගොඩනැඟිලි / පාරදෘශ්‍ය මෙවලම් භාවිතා කරයි, ඔවුන්ට ඉදිරියට එන ජාවාස්ක්‍රිප්ට් සින්ටැක්ස් භාවිතා කිරීමට ඉඩ සලසයි, පැරණි බ්‍රව්සර් සඳහා පසුගාමී අනුකූලතාවයක් සපයයි, ලිපිගොනු ඒකාබද්ධ කරයි, අවම කරන්න, කේත බෙදීම ආදිය සිදු කරන්න.


131
නෑ, නමුත් රයිනෝ තරම් උසස් දෙයක් භාවිතා කරන කෙනෙක් හෝ වෙනත් අයෙකු මෙම ප්‍රශ්නය අසන්නේ නැත.
ඊ-තෘප්

193
සම්පුර්ණ වීමට නම්, තුන්වන ක්‍රමයක් තිබේ: සමහර විසඳුම් වලදී ඔබ ජාවාස්ක්‍රිප්ට් ගොනු දෙකම පාලනය කරන විට, ඔබට යෝධ ජාවාස්ක්‍රිප්ට් ගොනුවක් 1 ක් සෑදිය හැකි අතර එය ගොනු දෙකේම අන්තර්ගතය ඒකාබද්ධ කරයි.
ටෝඩ්

20
"Document.createElement (" my_lovely_script.js ") නොකළ යුතුය; උදාහරණයක් ලෙස "document.createElement (" script ")" විය යුතුද?
රසල් සිල්වා

14
ඔබ ක්‍රියාත්මක කරන්නේ ඔබේ කේතය නම් එවාල් හැක් කිරීමට දොර විවර කරන්නේ කෙසේද?
වින්ස් පැනූසියෝ

6
ඔබේ පිළිතුරට IE ( onreadystatechangeසිදුවීම සහ readyStateදේපල) සඳහා යම් වෙනස් කිරීමක් අවශ්‍ය වේ . එසේම, ගතික ස්ක්‍රිප්ට් පැටවීම බ්‍රව්සරයේ පූර්ව පැටවුම් ස්කෑනර වලින් ප්‍රයෝජන නොගනී. මෙම HTML5Rocks ලිපිය නිර්දේශ කරන්න: html5rocks.com/en/tutorials/speed/script-loading
ruhong

571

යමෙකු වඩා දියුණු දෙයක් සොයන්නේ නම්, RequireJS උත්සාහ කරන්න . පරායත්තතා කළමනාකරණය, වඩා හොඳ සහසම්බන්ධය සහ අනුපිටපත් කිරීමෙන් වළකින්න (එනම්, ස්ක්‍රිප්ට් එකකට වඩා වරක් ලබා ගැනීම) වැනි අමතර ප්‍රතිලාභ ඔබට ලැබෙනු ඇත.

ඔබට ඔබේ ජාවාස්ක්‍රිප්ට් ලිපිගොනු "මොඩියුල" වලින් ලිවිය හැකි අතර පසුව ඒවා වෙනත් ස්ක්‍රිප්ට් වල පරායත්තයන් ලෙස සඳහන් කළ හැකිය. නැතහොත් ඔබට සරල "යන්න මෙම ස්ක්‍රිප්ට් ලබා ගන්න" විසඳුමක් ලෙස RequireJS භාවිතා කළ හැකිය.

උදාහරණයක්:

පරායත්තතා මොඩියුල ලෙස අර්ථ දක්වන්න:

some-dependency.js

define(['lib/dependency1', 'lib/dependency2'], function (d1, d2) {

     //Your actual script goes here.   
     //The dependent scripts will be fetched if necessary.

     return libraryObject;  //For example, jQuery object
});

ක්‍රියාත්මක කිරීම.ජේ යනු ඔබගේ "ප්‍රධාන" ජාවාස්ක්‍රිප්ට් ගොනුව වන අතර එය යම්කිසි පරායත්තතාව මත රඳා පවතී

require(['some-dependency'], function(dependency) {

    //Your script goes here
    //some-dependency.js is fetched.   
    //Then your script is executed
});

GitHub README වෙතින් උපුටා ගැනීම :

RequireJS සරල ජාවාස්ක්‍රිප්ට් ගොනු මෙන්ම වඩාත් අර්ථ දක්වා ඇති මොඩියුලයන් පටවයි. වෙබ් සේවකයෙකු ඇතුළුව බ්‍රව්සරයේ භාවිතය සඳහා එය ප්‍රශස්තිකරණය කර ඇත, නමුත් එය රයිනෝ සහ නෝඩ් වැනි වෙනත් ජාවාස්ක්‍රිප්ට් පරිසරවල භාවිතා කළ හැකිය. එය අසමමුහුර්ත මොඩියුල API ක්‍රියාත්මක කරයි.

RequireJS මොඩියුල / ගොනු පැටවීම සඳහා සරල ස්ක්‍රිප්ට් ටැග් භාවිතා කරයි, එබැවින් එය පහසුවෙන් නිදොස්කරණය කිරීමට ඉඩ දිය යුතුය. පවතින ජාවාස්ක්‍රිප්ට් ගොනු පූරණය කිරීම සඳහා එය සරලව භාවිතා කළ හැකිය ඔබේ ජාවාස්ක්‍රිප්ට් ගොනු නැවත ලිවීමකින් තොරව එය ඔබගේ පවතින ව්‍යාපෘතියට එක් කළ හැකිය.

...


1
aaaaidan: MattDmo ගේ හේතුව සහ එය බාහිර පුස්තකාලයක් මත රඳා පවතින අතර එය පිළිගත් පිළිතුර මත රඳා පවතී.
ඩේවිඩ් මෝල්ඩර්

1
Require.js ජය ගැනීම සඳහා වඩාත්ම නවතම කෝණික ජේඑස් වන අතර එය වඩාත් බන්ධන සහ පොහොසත් HTML විශේෂාංග සමඟ වඩාත් ස්ථාවර හා භාවිතා කිරීමට පහසුය.
zeeshan

5
-1: එම වියුක්ත කිරීම් - "යම්_ පරායත්තතාව" - ඇත්තෙන්ම දුප්පත් ය, දර්ශක ව්‍යාකූලත්වයට එක් කරයි. වැඩකරන කේත උදාහරණයක් මොන වගේද කියා තේරුම් ගැනීමට මම වෙහෙසෙමි. කතුවරයා වැඩ කරන ආදර්ශය සපයන්නේ නම්, ඕනෑම කෙනෙකුට පාහේ එය ඔහුගේ අවශ්‍යතාවන්ට සරිලන පරිදි සකස් කර ගත හැකිය.
ටෙගිරි නෙනෂි

1
ස්වයංක්‍රීය අවම කිරීම සමඟ
එම්වීසී

1
'එකතු කරන්න .. ඔබේ ජාවාස්ක්‍රිප්ට් ලිපිගොනු නැවත ලිවීමට සිදුවීම'; නියමයි, නමුත් කොහොමද හරියටම? කර්. පිළිතුරෙන් යෝජනා කරන්නේ එවැනි 'අවශ්‍යතාවයක්' ('needjs' නොවේද?) ප්‍රධාන ස්ක්‍රිප්ටයට + එවැනි යැපීමක් සෑම යැපෙන ගොනුවකටම, ඔව්? නමුත් එය නැවත ලිවීම නිසා නැවත ලිවීම නොකළ යුත්තේ කුමක්ද? RequireJS විසින් ඊ-ගොනුව ගෝලීය ඩෙෆ්ස් සාමාන්‍ය පරිදි කිරීමට ඉඩ දෙන බැවින් -rest හි කේතය? ඒක එහෙමද? මම එය උත්සාහ කළෙමි, + (අමතකද?) <Script src = " requiredjs.org/docs/release/2.2.0/comments/require.js "> </script>, පසුව 'requiredjs ([' GoogleDrive.com/host /.. ',..], ක්‍රියාකාරිත්වය
ගමනාන්ත ගෘහ නිර්මාණ ශිල්පියා

196

ඇත්තෙන්ම එහි වේ ජාවාස්ක්රිප්ට් ගොනුව ප්රවේශ කිරීමට ක්රමයක් නැත ඔබ එය පූර්ණය කිරීමෙන් පසුව ඔබගේ අලුතින් පටවනු ගොනුව අයිතිය ඇතුළත් කාර්යයන් භාවිතා කළ හැකි නිසා, අසම්මිතික, මම එය සියලු බ්රව්සර් වැඩ කියලා.

ඔබේ පිටුවේ මූලද්‍රව්‍යය jQuery.append()මත ඔබ භාවිතා කළ යුතුය <head>, එනම්:

$("head").append('<script type="text/javascript" src="' + script + '"></script>');

කෙසේ වෙතත්, මෙම ක්‍රමයට ද ගැටළුවක් ඇත: ආනයනය කරන ලද ජාවාස්ක්‍රිප්ට් ගොනුවේ දෝෂයක් සිදුවුවහොත්, ෆයර්බග් (සහ ෆයර්ෆොක්ස් දෝෂ කොන්සෝලය සහ ක්‍රෝම් සංවර්ධක මෙවලම් ද) එහි ස්ථානය වැරදි ලෙස වාර්තා කරනු ඇත, ඔබ ලුහුබැඳීමට ෆයර්බග් භාවිතා කරන්නේ නම් එය විශාල ගැටළුවක් වේ ජාවාස්ක්‍රිප්ට් දෝෂ ගොඩක් අඩුයි (මම කරනවා). කිසියම් හේතුවක් නිසා අලුතින් පටවන ලද ගොනුව ගැන ෆයර්බග් දන්නේ නැත, එබැවින් එම ගොනුවේ දෝෂයක් සිදුවුවහොත් එය ඔබගේ ප්‍රධාන HTML හි සිදු වූ බව වාර්තා කරයි ගොනුවේ දෝෂයට සැබෑ හේතුව සොයා ගැනීමට ඔබට අපහසු වනු ඇත.

නමුත් එය ඔබට ගැටළුවක් නොවේ නම්, මෙම ක්‍රමය ක්‍රියාත්මක විය යුතුය.

මම ඇත්ත වශයෙන්ම method .import_js () නමින් jQuery ප්ලගිනයක් ලියා ඇති අතර එය මෙම ක්‍රමය භාවිතා කරයි:

(function($)
{
    /*
     * $.import_js() helper (for JavaScript importing within JavaScript code).
     */
    var import_js_imported = [];

    $.extend(true,
    {
        import_js : function(script)
        {
            var found = false;
            for (var i = 0; i < import_js_imported.length; i++)
                if (import_js_imported[i] == script) {
                    found = true;
                    break;
                }

            if (found == false) {
                $("head").append('<script type="text/javascript" src="' + script + '"></script>');
                import_js_imported.push(script);
            }
        }
    });

})(jQuery);

එබැවින් ජාවාස්ක්‍රිප්ට් ආනයනය කිරීමට ඔබ කළ යුත්තේ:

$.import_js('/path_to_project/scripts/somefunctions.js');

උදාහරණයේදී මම මේ සඳහා සරල පරීක්ෂණයක් ද කළෙමි .

එයට main.jsප්‍රධාන HTML හි ගොනුවක් ඇතුළත් වන අතර පසුව අතිරේක ගොනුවක් ආයාත කිරීම සඳහා main.jsභාවිතා කරන ස්ක්‍රිප්ට් මෙම ක්‍රියාව නිර්වචනය කරයි:$.import_js()included.js

function hello()
{
    alert("Hello world!");
}

ඇතුළත් කළ විගසම included.js, hello()ශ්‍රිතය කැඳවනු ලැබේ, එවිට ඔබට අනතුරු ඇඟවීම ලැබේ.

(මෙම පිළිතුර ඊ-සට් 'අදහස් දැක්වීමට ප්‍රතිචාරයකි).


මම මෙම ක්‍රමය උත්සාහ කරමි, නමුත් මා වෙනුවෙන් ක්‍රියා නොකරයි, මූලද්‍රව්‍යය හිස් ටැගයේ නොපෙන්වයි.
අඩවි

16
ujuanpastas - භාවිතා කරන්න jQuery.getScript, ඒ ආකාරයෙන් ඔබ ප්ලගිනය ලිවීම ගැන කරදර විය යුතු නැත ...
MattDMo

6
හ්ම්, මෙම ලිපියට අනුව , scriptමූලද්‍රව්‍යයක් එකතු headකිරීමෙන් asyncඑය නිශ්චිතවම සකසා නොමැති නම් එය අසමමුහුර්තව ක්‍රියාත්මක වේ false.
Flimm

1
ස්ක්‍රිප්ට් විචල්‍යයට html ආයතන කේතනය කර තිබිය යුතු නොවේද? සබැඳියේ අඩංගු නම් ", කේතය කැඩී යනු ඇත
රෙඩ්ක්ලෝවර්

1
Lim සිහින් ආදරණීය මහත්මයාණෙනි, ඔබගේ අදහස් දැක්වීමට මා සහ මගේ කණ්ඩායම ස්තූතිවන්ත වන අතර අප කවදා හෝ පෞද්ගලිකව මුණගැසුණොත් මම ඔබට පෞද්ගලිකව ණය මුදලක් පවා ගෙවිය යුතුය
ඇලෙක්ස්

155

තවත් ක්‍රමයක් නම්, මගේ මතය අනුව වඩා පිරිසිදු ය, <script>ටැගයක් භාවිතා කිරීම වෙනුවට සමමුහුර්ත අජැක්ස් ඉල්ලීමක් කිරීම ය . Node.js හසුරුවන ආකාරයද එයයි.

JQuery භාවිතා කරන උදාහරණයක් මෙන්න:

function require(script) {
    $.ajax({
        url: script,
        dataType: "script",
        async: false,           // <-- This is the key
        success: function () {
            // all good...
        },
        error: function () {
            throw new Error("Could not load script " + script);
        }
    });
}

ඔබ සාමාන්‍යයෙන් ඇතුළත් කිරීමක් භාවිතා කරන බැවින් ඔබට එය ඔබේ කේතයේ භාවිතා කළ හැකිය:

require("/scripts/subscript.js");

ඊළඟ පේළියේ අවශ්‍ය ස්ක්‍රිප්ටයෙන් ශ්‍රිතයක් ඇමතීමට හැකි වනු ඇත:

subscript.doSomethingCool(); 

1
හොඳ විසඳුමක්, හිසට ඇතුළත් වන්නේ අවාසනාවකි, අජැක්ස් විසඳුම ක්‍රියා කරයි.
මැටියෝ කොන්ටා

17
වෙනත් අයෙකු සඳහන් කළ පරිදි, requiredjs.org විසින් මෙය සිදු කරන අතර පෙර-සම්පාදකයක් ද ඇති අතර එමඟින් js ගොනු එකට පටවන අතර ඒවා වේගයෙන් පටවනු ලැබේ. ඔබට එය පරීක්ෂා කිරීමට අවශ්‍ය විය හැකිය.
ඒරියල්

2
ක්‍රෝම්: // @ sourceURL = view_index.js
ටොඩ් වැන්ස්

11
අවාසනාවන්ත ලෙස, අසින්ක්: අසත්‍යය දැන් jQuery හි ඉවත් කර ඇත. අනාගතයේදී බිඳවැටීමට ඉඩ ඇත, එබැවින් මම වැළකී සිටිමි.
වර්ග

3
atkatsh අපි මෙහි jqXHR වස්තු භාවිතා නොකරමු. ඔබගේ උපුටා දැක්වීම async: falseඅවලංගු යැයි කියමින් ඔබගේ පෙර අදහස් දැක්වීම උපස්ථ කළ බවක් නොපෙනේ . එය එසේ නොවේ ය! ඔබේ උපුටා දැක්වීමෙහි දැක්වෙන පරිදි, jqXHR හා සම්බන්ධ දේවල් පමණි.
Zero3

101

ඔබට හොඳ ආරංචියක් ඇත. ඉතා ඉක්මනින් ඔබට ජාවාස්ක්‍රිප්ට් කේතය පහසුවෙන් පූරණය කළ හැකිය. එය ජාවාස්ක්‍රිප්ට් කේතයේ මොඩියුල ආනයනය කිරීමේ සම්මත ක්‍රමයක් බවට පත්වන අතර එය මූලික ජාවාස්ක්‍රිප්ට්හිම කොටසක් වනු ඇත.

ගොනුවකින් import cond from 'cond.js';නම් කරන ලද සාර්ව පැටවීමක් සඳහා ඔබ ලිවිය යුතුය .condcond.js

එබැවින් ඔබට කිසිදු ජාවාස්ක්‍රිප්ට් රාමුවක් මත විශ්වාසය තැබිය යුතු නැත, ඔබ පැහැදිලිවම අජැක්ස් ඇමතුම් ලබා ගත යුතු නැත.

වෙත යොමු වන්න:


12
jsfile මත අවශ්‍ය / ආනයනය ඉදිරි කාලය තුළ බොහෝ කාලයක් ගතවී ඇත. (IMO).
rwheadon

6
wrwheadon ඔව්, මෙය භාෂාවේ කොටසක් නොවන බව බියජනකයි! මිනිසුන් ඕනෑම දෙයක් කරන්නේ කෙසේද යන්න මට එහා ගිය දෙයක් නොවේ! මම එයට අලුත් වන අතර මෙය බොහෝ දෙනාගේ පිස්සු නරකම බව පෙනේ
ජොනීරා

ony ජොනී-ලීඩ්ස් මොඩියුලය පැටවීමකින් තොරව වුවද, බ්‍රව්සරයේ ජාවාස්ක්‍රිප්ට් නම්යශීලී වන අතර අපගේ මොඩියුල කළමනාකරණය සඳහා රික්වයිර් ජේඑස් වැනි පුස්තකාලයක් ක්‍රියාත්මක කළ හැකිය.
කීන්

8
මැද භාගයේ 2015- එහෙත්, ඕනෑම බ්රවුසර ක්රියාත්මක කර නැත developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
බිල්ලට

ඔව් ඔබ හරි. දැන් මට මේ ගැන නරකක් දැනෙන්නට පටන් ගෙන ඇත :(. ඔබ, සෑම බ්‍රව්සරයකම ක්‍රියාත්මක කළ විට මෙය ජාවාස්ක්‍රිප්ට් සඳහා ගොඩනගා ඇති විශිෂ්ට ලක්ෂණයකි.
ඉම්දාඩ්

97

ජාවාස්ක්‍රිප්ට් ටැගයක් ගතිකව ජනනය කර එය වෙනත් ජාවාස්ක්‍රිප්ට් කේත ඇතුළත සිට HTML ලේඛනයට එකතු කළ හැකිය. මෙය ඉලක්කගත ජාවාස්ක්‍රිප්ට් ගොනුව පටවනු ඇත.

function includeJs(jsFilePath) {
    var js = document.createElement("script");

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

    document.body.appendChild(js);
}

includeJs("/path/to/some/file.js");

8
@ ඊ-තෘප්තිය - ඇත්ත වශයෙන්ම, මෙය වාසියකි, සමමුහුර්ත ස්ක්‍රිප්ට් අවහිර වනු ඇත. පා courses මාලා සඳහා අශ්වයන්, නමුත් 10 න් 9 වතාවක් ඔබට අවහිර නොකිරීමේ විකල්පය අවශ්‍ය වේ.
annakata

It ස්විට්ලානා - මේ ආකාරයට නිර්මාණය කරන ලද ස්ක්‍රිප්ට් අංග අසංක වේ. වර්තමානයේ මෙය අඩුපාඩුවක් සූරාකෑමක් ලෙස සැලකිය හැකි බැවින් එය අනාගත සාක්ෂියක් නොවනු ඇත, මෙය පැහැදිලි කරන කිසිම ප්‍රමිතියකින් මා දැක නැත.
annakata

ඇත්තටම මම එය ආපසු ගන්නවා, මම දැක්කා ඔබ හිසට වඩා ශරීරයට එකතු වන බව.
annakata

@annakata: වෙනස කුමක්ද? BTW, යාහූ යෝජනා කරන්නේ ශරීරයේ අවසානයට ස්ක්‍රිප්ට් ටැග් එක් කිරීමටයි, එබැවින් ගතිකව එකතු කිරීමේදී එහි කිසිදු වරදක් නොවිය යුතුය.
ස්විට්ලානා මැක්සිම්චුක්

7
page ඊ-තෘප්තිමත් අසමමුහුර්ත වීම හොඳයි, මන්ද එය ඔබගේ පිටුව කැටි නොකරන බැවිනි. එය සිදු වූ විට දැනුම් දීමට ඇමතුම් ලබා ගැනීම භාවිතා කරන්නjs.onload = callback;
Vitim.us

74

ප්රකාශය import ECMAScript 6 හි ඇත.

සින්ටැක්ස්

import name from "module-name";
import { member } from "module-name";
import { member as alias } from "module-name";
import { member1 , member2 } from "module-name";
import { member1 , member2 as alias2 , [...] } from "module-name";
import name , { member [ , [...] ] } from "module-name";
import "module-name" as name;

... නමුත් ඔබ සම්බන්ධ කළ පිටුවේ ඇති අනුකූලතා වගුවට අනුව මේ දක්වා කිසිදු බ්‍රව්සරයක් සහාය නොදක්වයි.
Zero3

6
ඔබට දැන් ES6 කේතය ලිවිය හැකි අතර ඔබ කැමති වත්මන් මොඩියුල පද්ධතිය (CommonJS / AMD / UMD) කුමක් වුවත් එය බාබෙල්.ජේ ( babeljs.io ) සමඟ සම්පාදනය කළ හැකිය : babeljs.io/docs/usage/modules
ජෙරමි හැරිස්

@ Zero3 පෙනෙන විදිහට නව IE (එජ්) එකම එකයි
ජූලියන් අවාර්

2019 දී IE තවමත් කිසිදු ආකාරයකින් මෙයට සහාය නොදක්වයි. මයික්‍රොසොෆ්ට් භාවිතයට එරෙහිව එසේ විය යුත්තේ ඇයි?
ග්‍රේසේජ්

61

සමහර විට ඔබට මෙම පිටුවේ ඇති මෙම ශ්‍රිතය භාවිතා කළ හැකිය ජාවාස්ක්‍රිප්ට් ගොනුවක් ජාවාස්ක්‍රිප්ට් ගොනුවකට ඇතුළත් කරන්නේ කෙසේද? :

function include(filename)
{
    var head = document.getElementsByTagName('head')[0];

    var script = document.createElement('script');
    script.src = filename;
    script.type = 'text/javascript';

    head.appendChild(script)
}

5
එකතු කිරීමට ප්‍රයෝජනවත් විය යුතුයscript.onload = callback;
Vitim.us

@SvitlanaMaksymchuk ඉතින්, මම භාවිතා නොකරන්නේ නම්, varවිචල්‍යය ගෝලීය වේද?
ෆ්‍රැන්සිස්කෝ කෝරල්ස් මොරාලෙස්

RanFranciscoCorrales ඔව්.
ක්‍රිස්ටෝපර් චිචේ

එය ගෝලීයව අවසන් වන්නේ var සමඟ හෝ නැතිව :)
වෙද්‍රන් මාරිසෙවික්.


54

JQuery නොමැතිව සමමුහුර්ත අනුවාදය මෙන්න :

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

මෙම ක්‍රියාකාරී හරස් වසම ලබා ගැනීම සඳහා, සේවාදායකයාට allow-originඑහි ප්‍රතිචාරයේ ශීර්ෂකය සැකසීමට අවශ්‍ය බව සලකන්න .


විශිෂ්ට කාර්යයක්! ශරීරයෙන් පසුව අමතර JS ලිවීමට පෙර ජාවාස්ක්‍රිප්ට් පටවන්න. බහු ස්ක්‍රිප්ට් පූරණය කිරීමේදී ඉතා වැදගත් වේ.
tfont

3
in හීනොබ්: හරස් වසම සඳහා එය ක්‍රියාත්මක කිරීමට මට කුමක් කළ හැකිද? (ස්ක්‍රිප්ට් පැටවීම http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js)
පරිශීලක 2284570

22 user2284570: ඔබ විදේශීය වසමේ හිමිකරු නම්: සේවාදායක පිළිතුරෙහි 'allow-origin' ශීර්ෂය සකසන්න. ඔබ අයිතිකරු නොවේ නම්: කිසිවක් නැත. සමාවන්න! එය හරස් සම්භවය-ප්‍රතිපත්තියකි.
හීනොබ්

2
22 user2284570: ඔබේ විවරණය ඒ ආකාරයෙන් මට වැටහේ, ඔබ ස්ක්‍රිප්ට් පූරණය කිරීමට අවශ්‍ය වසමේ හිමිකරු නොවන බව. එවැනි අවස්ථාවකදී ඔබට ස්ක්‍රිප්ටයක් පූරණය කළ හැක්කේ ඇතුළු කළ <script>ටැගයක් හරහා මිස හරහා නොවේ XMLHttpRequest.
හීනොබ්

2
ෆයර්ෆොක්ස් හි මෙය භාවිතා කිරීමට අදහස් කරන අයට (ඉමාක්‍රොස් ස්ක්‍රිප්ටින් සඳහා කියන්න), මෙම රේඛාව ගොනුවේ ඉහළට එක් කරන්න:const XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");
ක්වෙෂන්

49

මම මේ ජාවාස්ක්‍රිප්ට් කේතය ලිව්වා ( DOM හැසිරවීම සඳහා මූලාකෘතිය භාවිතා කරමින් ):

var require = (function() {
    var _required = {};
    return (function(url, callback) {
        if (typeof url == 'object') {
            // We've (hopefully) got an array: time to chain!
            if (url.length > 1) {
                // Load the nth file as soon as everything up to the
                // n-1th one is done.
                require(url.slice(0, url.length - 1), function() {
                    require(url[url.length - 1], callback);
                });
            } else if (url.length == 1) {
                require(url[0], callback);
            }
            return;
        }
        if (typeof _required[url] == 'undefined') {
            // Haven't loaded this URL yet; gogogo!
            _required[url] = [];

            var script = new Element('script', {
                src: url,
                type: 'text/javascript'
            });
            script.observe('load', function() {
                console.log("script " + url + " loaded.");
                _required[url].each(function(cb) {
                    cb.call(); // TODO: does this execute in the right context?
                });
                _required[url] = true;
            });

            $$('head')[0].insert(script);
        } else if (typeof _required[url] == 'boolean') {
            // We already loaded the thing, so go ahead.
            if (callback) {
                callback.call();
            }
            return;
        }

        if (callback) {
            _required[url].push(callback);
        }
    });
})();

භාවිතය:

<script src="prototype.js"></script>
<script src="require.js"></script>
<script>
    require(['foo.js','bar.js'], function () {
        /* Use foo.js and bar.js here */
    });
</script>

සාරාංශය: http://gist.github.com/284442 .


7
jrburke මෙය RequireJS ලෙස ලිවීය. Github: requiredjs.org/docs/requirements.html
මයික් කැරන්

මෙය පටවා ඇති ස්ක්‍රිප්ට් අවශ්‍ය () ලෙස හැඳින්වෙන විෂය පථයෙන් පිටත තැබීමක් නොවේද? එය විෂය පථය තුළ කළ හැකි එකම ක්‍රමය eval () බව පෙනේ. නැත්නම් වෙනත් ක්‍රමයක් තිබේද?
trusktr

44

ෆේස්බුක් ඔවුන්ගේ සර්වබලධාරී බොත්තම සඳහා එය කරන්නේ කෙසේද යන්න පිළිබඳ සාමාන්‍යකරණය කළ අනුවාදය මෙන්න:

<script>
  var firstScript = document.getElementsByTagName('script')[0],
      js = document.createElement('script');
  js.src = 'https://cdnjs.cloudflare.com/ajax/libs/Snowstorm/20131208/snowstorm-min.js';
  js.onload = function () {
    // do stuff with your dynamically loaded script
    snowStorm.snowColor = '#99ccff';
  };
  firstScript.parentNode.insertBefore(js, firstScript);
</script>

එය ෆේස්බුක් සඳහා වැඩ කරන්නේ නම්, එය ඔබ වෙනුවෙන් වැඩ කරනු ඇත.

සමහර බ්‍රව්සර් අතුරුදහන් වුවහොත් එකක් නිර්මාණය නොකිරීම හෝ scriptඒ වෙනුවට අපි පළමු මූලද්‍රව්‍යය සෙවීමට හේතුව , නමුත් අපට මූලද්‍රව්‍යයක් ඇති බවට සහතික වී ඇත - මෙය. වැඩිදුර කියවන්න http://www.jspatterns.com/the-ridiculus-case-of-adding-a-script-element/ .headbodyscript


3
හොඳයි! මෙහි සමහර ක්‍රම ද ක්‍රියාත්මක වේ, නමුත් ගතික පසුබිමක් යටතේ මෙය හොඳම දේ කරයි.
tfont

ජනරජය තුරන් කිරීම සඳහා මම ඔබේ පිටපත දිගු කළෙමි
කමිල්

39

ඔබට පිරිසිදු ජාවාස්ක්‍රිප්ට් වලින් අවශ්‍ය නම්, ඔබට භාවිතා කළ හැකිය document.write.

document.write('<script src="myscript.js" type="text/javascript"></script>');

ඔබ jQuery පුස්තකාලය භාවිතා කරන්නේ නම්, ඔබට $.getScriptක්‍රමය භාවිතා කළ හැකිය .

$.getScript("another_script.js");

8
document.write අනෙක් සියල්ල ඉවත් කරන්නේ නැද්ද?
ඊසා ආදිල්

30

ඔබට PHP භාවිතයෙන් ඔබේ ස්ක්‍රිප්ට් එකලස් කළ හැකිය :

ගොනුව main.js.php:

<?php
    header('Content-type:text/javascript; charset=utf-8');
    include_once("foo.js.php");
    include_once("bar.js.php");
?>

// Main JavaScript code goes here

16
මේ සියල්ල ජාවාස්ක්‍රිප්ට් එකේ ඉදිරිපස කෙළවරේ තබා ගැනීම කාරණය බව පෙනේ
ඒරියල්

1
මෙය මතක් කිරීම ගැන ස්තූතියි. ඔබේ HTML ශීර්ෂයේ PHP ලිවීම <script> ටැග් ද තිබිය හැකිය, එවිට ඔබට අවශ්‍ය js ගොනු පටවනු ලැබේ (ඒවා පමණක්).
රොල්ෆ්

29

මෙහි පෙන්වා ඇති බොහෝ විසඳුම් ගතික පැටවීම අදහස් කරයි. මම ඒ වෙනුවට සොයමින් සිටියේ සියලු යැපෙන ගොනු තනි ප්‍රතිදාන ගොනුවකට එක් කරන සම්පාදකයෙකු සඳහා ය. සමාන අඩු / Sass තැටියක CSS සමඟ preprocessors ගනුදෙනුව@import දී පාලනය. මේ ආකාරයේ යහපත් කිසිවක් මට සොයාගත නොහැකි වූ නිසා, මම ගැටළුව විසඳන සරල මෙවලමක් ලිව්වෙමි.

ඉතින් මෙන්න https://github.com/dsheiko/jsic නම් සම්පාදකයා, $import("file-path")ඉල්ලූ ගොනු අන්තර්ගතය ආරක්ෂිතව ප්‍රතිස්ථාපනය කරයි . අනුරූප ග්‍රන්ට් ප්ලගිනය මෙන්න : https://github.com/dsheiko/grunt-jsic .

JQuery මාස්ටර් ශාඛාවේදී, ඒවා හුදෙක් පරමාණුක මූලාශ්‍ර ලිපිගොනු එකකට ආරම්භ කර intro.jsඅවසන් වනවා outtro.js. ප්‍රභව කේත සැකැස්මේ නම්‍යශීලී බවක් ලබා නොදෙන බැවින් එය මට නොගැලපේ. එය jsic සමඟ ක්‍රියා කරන්නේ කෙසේදැයි බලන්න:

src / main.js

var foo = $import("./Form/Input/Tel");

src / Form / Input / Tel.js

function() {
    return {
          prop: "",
          method: function(){}
    }
}

දැන් අපට සම්පාදකය ධාවනය කළ හැකිය:

node jsic.js src/main.js build/mail.js

ඒකාබද්ධ ගොනුව ලබා ගන්න

build / main.js

var foo = function() {
    return {
          prop: "",
          method: function(){}
    }
};

2
මෙම ලිපියෙන් මම වඩා හොඳ විසඳුමක් ඉදිරිපත් කළෙමි - CommonJS මොඩියුලය සම්පාදකයා - github.com/dsheiko/cjsc එබැවින් ඔබට CommonJs හෝ NodeJs මොඩියුල ලිවීමට හා එකිනෙකාට ප්‍රවේශ විය හැකි නමුත් ඒවා හුදකලා පරාසයක තබා ගත හැකිය. ප්‍රතිලාභ: ක්‍රියාකාරීත්වයට බලපාන බහු HTTP ඉල්ලීම් අවශ්‍ය නොවේ ඔබට මොඩියුල කේතය අතින් එතීම අවශ්‍ය නොවේ - එය සම්පාදකයාගේ වගකීමකි (වඩා හොඳ ප්‍රභව කේත කියවීමේ හැකියාව) ඔබට බාහිර පුස්තකාල අවශ්‍ය නොවේ එය UMD සමඟ අනුකූල වේ. සහ NodeJs මොඩියුල (උදා: ඔබට ඔවුන්ගේ කේතය ස්පර්ශ නොකර jQuery, කොඳු නාරටිය මොඩියුල ලෙස ඇමතිය හැකිය)
දිමිත්‍රි ෂයිකෝ

26

ජාවාස්ක්‍රිප්ට් ගොනුව පූරණය කිරීමේ ඔබේ අභිප්‍රාය ආනයනික / ඇතුළත් කළ ගොනුවේ කාර්යයන් භාවිතා කරන්නේ නම් , ඔබට ගෝලීය වස්තුවක් නිර්වචනය කර ශ්‍රිත වස්තු අයිතම ලෙස සැකසිය හැකිය. උදාහරණයක් වශයෙන්:

global.js

A = {};

file1.js

A.func1 = function() {
  console.log("func1");
}

file2.js

A.func2 = function() {
  console.log("func2");
}

main.js

A.func1();
A.func2();

ඔබ HTML ගොනුවක ස්ක්‍රිප්ට් ඇතුළත් කරන විට ප්‍රවේශම් විය යුතුය. ඇණවුම පහත පරිදි විය යුතුය:

<head>
  <script type="text/javascript" src="global.js"></script>
  <script type="text/javascript" src="file1.js"></script>
  <script type="text/javascript" src="file2.js"></script>
  <script type="text/javascript" src="main.js"></script>
</head>

22

මෙය කළ යුත්තේ:

xhr = new XMLHttpRequest();
xhr.open("GET", "/soap/ajax/11.0/connection.js", false);
xhr.send();
eval(xhr.responseText);

5
එහි evalඇති වැරැද්ද එයයි. සිට Crockford , " evalනපුරු. මෙම evalඋත්සවය JavaScript වඩාත් වංචාකර ලක්ෂණයකි. එය වළකින්න. evalයොමුවීම් ඇත. දෝ භාවිතා නො Functionඉදිකිරීමටත්. ගැනීමට නූල් සමත් එපා setTimeoutහෝ setInterval." ඔබ ඔහුගේ "ජාවාස්ක්‍රිප්ට්: හොඳ කොටස්" කියවා නොමැතිනම් පිටතට ගොස් දැන්ම එය කරන්න. ඔබ ගැන පසුතැවෙන්නේ නැත.
MattDMo

13
AttMattDMo "කවුරුහරි කිව්වොත් ඒක නරකයි" ඇත්තටම තර්කයක් නොවේ.
කේසි

4
odemodendroket මම හිතන්නේ ඩග්ලස් ක්‍රොක්ෆර්ඩ් කියන්නේ කවුද කියලා ඔබ දන්නේ නැහැ .
MattDMo

13
AttMattDMo ඔහු කවුදැයි මම හොඳින් දනිමි, නමුත් ඔහු මිනිසෙකු මිස දෙවියෙකු නොවේ.
කේසි

2
gtggagne: හරස් වසම සඳහා එය ක්‍රියාත්මක කිරීමට මට කුමක් කළ හැකිද? (ස්ක්‍රිප්ට් පූරණය වෙමින් http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js)
පරිශීලක 2284570

21

නැතහොත් ධාවන වේලාවට ඇතුළත් කරනවා වෙනුවට, උඩුගත කිරීමට පෙර සංයුක්ත කිරීමට ස්ක්‍රිප්ට් එකක් භාවිතා කරන්න.

මම ස්ප්රොකට් භාවිතා කරමි (වෙනත් අය සිටීදැයි මම නොදනිමි). ඔබ ඔබේ ජාවාස්ක්‍රිප්ට් කේතය වෙනම ලිපිගොනු වලින් සාදන අතර ස්ප්‍රොකට් එන්ජිම මඟින් සැකසූ අදහස් ඇතුළත් වේ. සංවර්ධනය සඳහා ඔබට අනුපිළිවෙලින් ලිපිගොනු ඇතුළත් කළ හැකිය, ඉන්පසු නිෂ්පාදනය ඒකාබද්ධ කිරීම සඳහා ...

මෙයද බලන්න:



18

මට සරල ප්‍රශ්නයක් තිබුනද මෙම ප්‍රශ්නයට ප්‍රතිචාර දැක්වීමෙන් මා ව්‍යාකූල විය.

එක් ජාවාස්ක්‍රිප්ට් ගොනුවක (myvariables.js) අර්ථ දක්වා ඇති විචල්‍යයක් (myVar1) වෙනත් ජාවාස්ක්‍රිප්ට් ගොනුවක (main.js) භාවිතා කිරීමට මට සිදු විය.

මේ සඳහා මම පහත පරිදි කළෙමි:

ජාවාස්ක්‍රිප්ට් කේතය HTML ගොනුවේ පටවා, නිවැරදි අනුපිළිවෙලින්, myvariables.js පළමුව, පසුව main.js:

<html>
    <body onload="bodyReady();" >

        <script src="myvariables.js" > </script>
        <script src="main.js" > </script>

        <!-- Some other code -->
    </body>
</html>

ගොනුව: myvariables.js

var myVar1 = "I am variable from myvariables.js";

ගොනුව: main.js

// ...
function bodyReady() {
    // ...
    alert (myVar1);    // This shows "I am variable from myvariables.js", which I needed
    // ...
}
// ...

ඔබ දුටු පරිදි, මම වෙනත් ජාවාස්ක්‍රිප්ට් ගොනුවක එක් ජාවාස්ක්‍රිප්ට් ගොනුවක විචල්‍යයක් භාවිතා කර ඇත, නමුත් මට තවත් එකක් ඇතුළත් කිරීමට අවශ්‍ය නොවීය. පළමු ජාවාස්ක්‍රිප්ට් ගොනුව දෙවන ජාවාස්ක්‍රිප්ට් ගොනුවට පෙර පටවා ඇති බව සහතික කිරීමට මට අවශ්‍ය වූ අතර පළමු ජාවාස්ක්‍රිප්ට් ගොනුවේ විචල්‍යයන් දෙවන ජාවාස්ක්‍රිප්ට් ගොනුවට ස්වයංක්‍රීයව ප්‍රවේශ විය හැකිය.

මේකෙන් මගේ දවස බේරුණා. මම හිතනවා මේක උදව් වෙයි කියලා.


මෙම පිළිතුරේ ඇති ගැටළුව නම් එය එවැනි දෙයක් නොවන බවයි import. එක් js ගොනුවක සිට තවත් ගොනුවකට දේවල් ලබා ගැනීමට ඔබට HTML ගොනුවක් අවශ්‍ය වේ.
කැනයිසයිඩ්

ඉතා ඇත්ත. වෙනත් පිළිතුරු වලට එය විසඳුම් ලෙස තිබේ. කෙසේ වෙතත් මා සතුව JS ගොනු දෙකක් තිබුනි, එකක් වෙනත් JS හි විචල්‍යයන් භාවිතා කළ යුතුය. Node.js, next.js, express.js යනාදිය නැත, එබැවින් ආනයනය කිරීම හෝ අවශ්‍ය වීම ක්‍රියා නොකරනු ඇත, සරල .js ගොනු තිබුනි.
මනෝහර් රෙඩ්ඩි පෝරෙඩි

කෙසේ වෙතත්, තේරුම් ගත හැකි කරුණ නම්, ඇත්ත වශයෙන්ම ජාවාස්ක්‍රිප්ට් ගොනුවක් වෙනත් ගොනුවක් තුළම ආනයනය කිරීමට මිස HTML ගොනුවක් භාවිතයෙන් එහි විචල්‍යයන්ට ප්‍රවේශ වීම නොවේ. නිදසුනක් ලෙස, ඔබ බොත්තමක් සඳහා ක්‍රියාකාරීත්වයක් සාදයි යැයි උපකල්පනය කරන්න, ඔබ වෙනස් js ගොනු තුනක් භාවිතා කරයි, එකක් ක්ලික් කිරීම සඳහා, එකක් හෝවර් හැසිරවීම සඳහා, එකක් අනෙක් දෙක සඳහා ඇමතුම් සඳහා. තුන්වන js තුළම අනෙක් js දෙක ආනයනය කිරීම ප්‍රයෝජනවත් වන අතර එක් <script>ටැගයක් පමණක් ඇත . මෙය සංවිධානයට උදව් කළ හැකිය. මෙම පිළිතුර හුදෙක් ප්‍රශ්නය ඉල්ලා සිටි දෙය නොවේ, මෙම සන්දර්භය තුළ එය පරිපූර්ණ නොවේ.
කැනයිසයිඩ්

මගේ ගැටලුවට විසඳුමක් සෙවූ විට, මම නිවැරදි මාර්ගය සෙව්වෙමි, කෙසේ වෙතත් ගූගල් සිතන්නේ මෙය නිවැරදි පිටුව යැයි සිතන නිසා මම මෙහි ගොඩ බැස්සෙමි. ඒ නිසයි මම මගේ පිළිතුර මෙහි ලිව්වේ. පේන හැටියට, මම ඉහළින් කළා 15 ක් නිසා. අනෙක් අයගේ කාලය නාස්ති නොකිරීමට, මගේ තත්වය කුමක්ද යන්න පිළිබඳව මම පැහැදිලි ආරම්භයක් ලබා දී ඇත්තෙමි - HTML කේතයට මුල් තැන දී ඇත - එය උදව්වක් සේ පෙනේ, මන්ද ඔබ පිළිතුරු දුන් අතර html ඔබේ තත්වය නොවන බව පැවසූ බැවිනි. පැහැදිලි කළ බලාපොරොත්තුව.
මනෝහර් රෙඩ්ඩි පෝරෙඩි

ඔව් - ඇත්ත වශයෙන්ම සමහර අය තරමක් වෙනස් ගැටළුවක් සෙවූ බවක් පෙනේ, මෙය විසඳුමක් වන අතර මෙය සොයා ගත්තේය. මෙය අනිවාර්යයෙන්ම මෙම ප්‍රශ්නයට පිළිතුර නොවුනත්, එය නියත වශයෙන්ම වෙනත් සමාන ප්‍රශ්නයකට පිළිතුරයි. එනිසා, මෙම පිළිතුර මෙහි තිබීම හරි, එය එම පිළිතුර සොයන අයට උපකාරී වන බැවිනි. එම පිළිතුරට ස්තූතියි, එය පැහැදිලි කළේය.
කැනයිසයිඩ්

16

ඔබ වෙබ් සේවකයින් භාවිතා කරන්නේ නම් සහ සේවකයාගේ විෂය පථයට අමතර ස්ක්‍රිප්ට් ඇතුළත් කිරීමට අවශ්‍ය නම්, ටැගයට ස්ක්‍රිප්ට් එකතු කිරීම පිළිබඳ වෙනත් පිළිතුරු headඔබ වෙනුවෙන් ක්‍රියා නොකරනු ඇත.

වාසනාවකට මෙන්, වෙබ් සේවකයින්ට ඔවුන්ගේම importScriptsශ්‍රිතයක් ඇති අතර එය වෙබ් සේවකයාගේ විෂය පථයේ ගෝලීය ශ්‍රිතයක් වන අතර එය පිරිවිතරයේ කොටසක් බැවින් බ්‍රව්සරයටම ආවේණික වේ.

විකල්පයක් ලෙස, ඔබේ ප්‍රශ්න ඉස්මතු කිරීම් වලට වැඩිම ඡන්දය දුන් දෙවන පිළිතුර ලෙස , RequireJS හට වෙබ් සේවකයෙකු තුළ ඇති ස්ක්‍රිප්ට් ද ඇතුළත් කළ හැකිය (බොහෝ විට importScriptsඑය තමාටම කියා ගත හැකි නමුත් තවත් ප්‍රයෝජනවත් අංග කිහිපයක් සමඟ).


16

නූතන භාෂාවෙන් චෙක්පත සමඟ දැනටමත් ස්ක්‍රිප්ට් පටවා තිබේ නම්:

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

භාවිතය (අසංක / බලා සිටින්න):

try { await loadJs("https://.../script.js") } 
catch(error) {console.log(error)}

හෝ

await loadJs("https://.../script.js").catch(err => {})

භාවිතය (පොරොන්දුව):

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

හොඳයි. හොඳ විසඳුමක්.
නෆ්තාලි හෝ නීල්

සංක්ෂිප්ත හා ES5 පමණක් අවශ්‍ය වන අතර විධිමත් ලෙස නැවත ඇමතුමක් ලබා ගැනීම වළක්වාලයි. ස්තූතියි දිමිත්‍රි!
යුරේකා

වාව්, සේවාදායකයක් නොමැතිව බ්‍රව්සරයේ ක්‍රියා කරයි. pi.js = සරලව var pi = 3.14. loadJS () ශ්‍රිතය හරහා loadJs("pi.js").then(function(){ console.log(pi); });
අමතන්න

14

මෙම @importCSS වැනි JavaScript ආනයනය සපුරා ගැනීම සඳහා කාරක රීති ඔවුන්ගේ විශේෂ හරහා එවැනි පොහොර මිශ්රණය ලෙස මෙවලම භාවිතා කර හැකි ය .mix(බලන්න ගොනු වර්ගය මෙතන ). මම නොදනිමි, නමුත් යෙදුම ඉහත සඳහන් ක්‍රමවලින් එකක් අන්තර්ග්‍රහණය කරයි.

.mixලිපිගොනු වල මිශ්‍රණ ප්‍රලේඛනයෙන් :

මික්ස් ගොනු හුදෙක් .js හෝ .css ගොනු .mix සමඟ. ගොනු නාමයෙන්. මිශ්‍ර ගොනුවක් සාමාන්‍ය ශෛලියක හෝ ස්ක්‍රිප්ට් ගොනුවක ක්‍රියාකාරිත්වය විස්තාරණය කරන අතර ආනයනය කිරීමට හා ඒකාබද්ධ කිරීමට ඔබට ඉඩ සලසයි.

.mixබහුවිධ .jsගොනු එකකට ඒකාබද්ධ කරන උදාහරණ ගොනුවක් මෙන්න :

// scripts-global.mix.js
// Plugins - Global

@import "global-plugins/headroom.js";
@import "global-plugins/retina-1.1.0.js";
@import "global-plugins/isotope.js";
@import "global-plugins/jquery.fitvids.js";

මිශ්‍රණය මෙය scripts-global.jsකුඩා අනුවාදයක් ලෙස ප්‍රතිදානය කරයි ( scripts-global.min.js).

සටහන: මම මිශ්‍රණ සමඟ සම්බන්ධ නොවෙමි, එය ඉදිරිපස සංවර්ධන මෙවලමක් ලෙස භාවිතා කිරීම හැර. .mixජාවාස්ක්‍රිප්ට් ගොනුවක් ක්‍රියාත්මක වන ආකාරය දැකීමෙන් (මිශ්‍ර බොයිලේරු වලින් එකක) සහ එයින් තරමක් ව්‍යාකූලත්වයට පත්වීම ("ඔබට මෙය කළ හැකිද?" මම සිතුවෙමි). එවිට එය යෙදුම් විශේෂිත ගොනු වර්ගයක් බව මට වැටහුණි (තරමක් බලාපොරොත්තු සුන් වූ, එකඟ වූ). කෙසේවෙතත්, දැනුම අන් අයට ප්‍රයෝජනවත් වේ යැයි සිතුවා.

යාවත්කාලීන කිරීම : මිශ්‍රණය දැන් නොමිලේ (නොබැඳි).

යාවත්කාලීන කිරීම : මිශ්‍රණය දැන් අත්හිටුවා ඇත. පැරණි මිශ්‍රණ නිකුත් කිරීම් තවමත් පවතී


එය නෝඩ් මොඩියුලයක් නම් මෙය නියමයි.
b01

01 b01 අභියෝගයක් සේ පෙනේ;) මට කාලය තිබුනේ නම් ... සමහර විට වෙනත් අයෙකු එසේ කරයිද?
අයිසැක් ග්‍රෙග්සන්

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

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

document.body.appendChild(js);

2
මෙය සරලම කේතය වන නමුත් තවමත් නොපවතින හෝ වෙනස් කළ නොහැකි අවස්ථාවන්හිදීbody එය අසාර්ථක වනු ඇත . එසේම, එය පිළිතුරු පැහැදිලි කිරීමට උපකාරී වේ.
ඩෑන් ඩස්කල්ස්කු

13

මගේ සුපුරුදු ක්‍රමය:

var require = function (src, cb) {
    cb = cb || function () {};

    var newScriptTag = document.createElement('script'),
        firstScriptTag = document.getElementsByTagName('script')[0];
    newScriptTag.src = src;
    newScriptTag.async = true;
    newScriptTag.onload = newScriptTag.onreadystatechange = function () {
        (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') && (cb());
    };
    firstScriptTag.parentNode.insertBefore(newScriptTag, firstScriptTag);
}

එය විශිෂ්ට ලෙස ක්‍රියාත්මක වන අතර මා සඳහා පිටු නැවත පූරණය කිරීමක් භාවිතා නොකරයි. මම AJAX ක්‍රමය අත්හදා බැලුවෙමි (අනෙක් පිළිතුරු වලින් එකක්) නමුත් එය මට එතරම් සාර්ථක නොවන බව පෙනේ.

කුතුහලය දනවන අය සඳහා කේතය ක්‍රියා කරන ආකාරය පිළිබඳ පැහැදිලි කිරීමක් මෙන්න: අත්‍යවශ්‍යයෙන්ම, එය URL හි නව ස්ක්‍රිප්ට් ටැගයක් (පළමු එකෙන් පසුව) නිර්මාණය කරයි. එය එය අසමමුහුර්ත මාදිලියට සකසයි, එමඟින් එය අනෙක් කේතය අවහිර නොකරයි, නමුත් සුදානම් ස්ථානය (පැටවිය යුතු අන්තර්ගතයේ තත්වය) 'පටවන ලද' ලෙස වෙනස් වූ විට නැවත ඇමතුමක් ලබා දේ.


13

මෙම පිළිතුරු විශිෂ්ට වුවත්, ස්ක්‍රිප්ට් පැටවීම පැවතුන දා සිට සරල “විසඳුමක්” පවතින අතර එය බොහෝ පුද්ගලයින්ගේ භාවිත අවස්ථා වලින් 99.999% ක් ආවරණය කරයි. ඔබට අවශ්‍ය ස්ක්‍රිප්ටය අවශ්‍ය ස්ක්‍රිප්ටයට පෙර ඇතුළත් කරන්න. බොහෝ ව්‍යාපෘති සඳහා කුමන ස්ක්‍රිප්ට් අවශ්‍යද සහ කුමන අනුපිළිවෙලටද යන්න තීරණය කිරීමට වැඩි කාලයක් ගත නොවේ.

<!DOCTYPE HTML>
<html>
    <head>
        <script src="script1.js"></script>
        <script src="script2.js"></script>
    </head>
    <body></body>
</html>

ස්ක්‍රිප්ට් 2 ට ස්ක්‍රිප්ට් 1 අවශ්‍ය නම්, මෙය සැබවින්ම මෙවැනි දෙයක් කිරීමට ඇති පහසුම ක්‍රමයයි. සෑම කෙනෙකුම පාහේ අදාළ වන වඩාත්ම පැහැදිලිව හා සරලම පිළිතුර ලෙස කිසිවෙකු මෙය ගෙන නොතිබීම ගැන මම පුදුම වෙමි.


1
මා ඇතුළු බොහෝ අය සඳහා මම අනුමාන කරමි, අපට ගතික ගොනු නාමයක් අවශ්‍යය.
ස්ටුවර්ට් මැකින්ටයර්

1
එම නඩුව @StuartMcIntyre, ක්රියාත්මක වීමේදී එහි තිර රචනය ටැගය ඇති src 'විශේෂණය කර, සහ පැල්ටපෝමයක් අවස්ථාවට සඳහා රැක (ඇත්තෙන්ම එහි 2019 දී එම නඩුව වඩා හොඳ විසඳුම් වේ).
KthProg

12

ජාවාස්ක්‍රිප්ට් හි මොඩියුල ස්ක්‍රිප්ට් ආනයනය කිරීමේ / ඇතුළත් කිරීමේ කාර්යය ස්වයංක්‍රීය කරන සරල මොඩියුලයක් මා ලිවීය. කේතය පිළිබඳ සවිස්තරාත්මක පැහැදිලි කිරීමක් සඳහා, ජාවාස්ක්‍රිප්ට් අවශ්‍ය / ආයාත / මොඩියුල ඇතුළත් බ්ලොග් සටහන බලන්න .

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

require('ivar.util.string');
require('ivar.net.*');
require('ivar/util/array.js');
require('http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js');

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

    //--------------------

var _rmod = _rmod || {}; //Require module namespace
_rmod.LOADED = false;
_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;
    }
};

_.rmod = namespaceToUri = function(script_name, url) {
    var np = script_name.split('.');
    if (np.getLast() === '*') {
        np.pop();
        np.push('_all');
    }

    if(!url)
        url = '';

    script_name = np.join('.');
    return  url + np.join('/')+'.js';
};

//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 uri = '';
    if (script_name.indexOf('/') > -1) {
        uri = script_name;
        var lastSlash = uri.lastIndexOf('/');
        script_name = uri.substring(lastSlash+1, uri.length);
    } 
    else {
        uri = _rmod.namespaceToUri(script_name, ivar._private.libpath);
    }

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

10

මෙම ස්ක්‍රිප්ට් වෙනත් ඕනෑම <script>ටැගයක මුදුනට ජාවාස්ක්‍රිප්ට් ගොනුවක් එක් කරයි :

(function () {
    var li = document.createElement('script'); 
    li.type = 'text/javascript'; 
    li.src= "http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"; 
    li.async=true; 
    var s = document.getElementsByTagName('script')[0]; 
    s.parentNode.insertBefore(li, s);
})();

10

Head.jsඇත . එය සමඟ කටයුතු කිරීම ඉතා පහසු ය:

head.load("js/jquery.min.js",
          "js/jquery.someplugin.js",
          "js/jquery.someplugin.css", function() {
  alert("Everything is ok!");
});

ඔබ දකින පරිදි, එය Require.js වලට වඩා පහසු වන අතර jQuery $.getScriptක්‍රමයට වඩා පහසුය . කොන්දේසි සහිත පැටවීම, විශේෂාංග හඳුනාගැනීම සහ තවත් බොහෝ දියුණු අංගයන් ද එහි ඇත .


10

මෙම ප්‍රශ්නයට විභව පිළිතුරු ගොඩක් තිබේ. මගේ පිළිතුර පැහැදිලිවම ඒවා ගණනාවක් මත පදනම් වේ. සියලු පිළිතුරු කියවීමෙන් පසු මා අවසන් කළේ මෙයයි.

$.getScriptපැටවීම සම්පුර්ණ වූ විට නැවත ඇමතුමක් අවශ්‍ය වන ගැටලුව සහ ඇත්ත වශයෙන්ම වෙනත් විසඳුමක් නම්, ඔබ එය භාවිතා කරන ගොනු කිහිපයක් තිබේ නම් සහ එකිනෙකා මත රඳා පවතී නම්, සියලු ස්ක්‍රිප්ට් පටවා ඇති විට දැන ගැනීමට ඔබට තවදුරටත් ක්‍රමයක් නොමැත (ඒවා කූඩු කළ පසු බහු ගොනු වල).

උදාහරණයක්:

file3.js

var f3obj = "file3";

// Define other stuff

file2.js:

var f2obj = "file2";
$.getScript("file3.js", function(){

    alert(f3obj);

    // Use anything defined in file3.
});

file1.js:

$.getScript("file2.js", function(){
    alert(f3obj); //This will probably fail because file3 is only guaranteed to have loaded inside the callback in file2.
    alert(f2obj);

    // Use anything defined in the loaded script...
});

සමමුහුර්තව ධාවනය කිරීමට හෝ XMLHttpRequest භාවිතා කිරීමට ඔබට අජැක්ස් නියම කළ හැකි බව ඔබ පැවසූ විට ඔබ හරි ය , නමුත් වර්තමාන ප්‍රවණතාවය සමමුහුර්ත ඉල්ලීම් අවලංගු කිරීම බව පෙනේ, එබැවින් ඔබට දැන් හෝ අනාගතයේදී සම්පූර්ණ බ්‍රව්සර සහාය නොලැබෙනු ඇත.

$.whenවිලම්බිත වස්තු සමූහයක් පරික්ෂා කිරීම සඳහා ඔබට භාවිතා කිරීමට උත්සාහ කළ හැකිය, නමුත් දැන් ඔබ මෙය සෑම ගොනුවකම සිදු කරන අතර ගොනුව 2 ක්‍රියාත්මක වන විගසම ඇමතුම ක්‍රියාත්මක වන විට නොව පැටවීම ලෙස සලකනු ලැබේ $.when, එබැවින් file3 පැටවීමට පෙර file1 තවමත් ක්‍රියාත්මක වේ. . මෙය ඇත්ත වශයෙන්ම තවමත් එකම ගැටලුවකි.

ඉදිරියට යාම වෙනුවට පසුපසට යාමට මම තීරණය කළෙමි. ස්තූතියි document.writeln. එය තහනම් බව මම දනිමි, නමුත් එය නිවැරදිව භාවිතා කරන තාක් කල් මෙය හොඳින් ක්‍රියාත්මක වේ. ඔබ අවසන් කරන්නේ පහසුවෙන් නිදොස්කරණය කළ හැකි, DOM හි නිවැරදිව පෙන්වන සහ පරායත්තයන් නිවැරදිව පටවා ඇති අනුපිළිවෙල සහතික කිරීමට ය.

ඔබට ඇත්ත වශයෙන්ම $ ("ශරීරය") භාවිතා කළ හැකිය. එකතු කරන්න (), නමුත් ඔබට තවදුරටත් නිවැරදිව නිදොස්කරණය කළ නොහැක.

සටහන: ඔබ මෙය භාවිතා කළ යුත්තේ පිටුව පූරණය වන විට පමණි, එසේ නොමැතිනම් ඔබට හිස් තිරයක් ලැබේ. වෙනත් වචන වලින් කිවහොත්, සෑම විටම මෙය document.ready ට පෙර / පිටත තබන්න . ක්ලික් කිරීමේ සිදුවීමක හෝ එවැනි දෙයක් තුළ පිටුව පූරණය කිරීමෙන් පසුව මම මෙය භාවිතා කර ඇති බව පරීක්‍ෂා කර නැත, නමුත් එය අසාර්ථක වනු ඇතැයි මට විශ්වාසයි.

JQuery දීර් ing කිරීමේ අදහසට මම කැමතියි, නමුත් පැහැදිලිවම ඔබට එය අවශ්‍ය නොවේ.

ඇමතීමට පෙර document.writeln, සියලු ස්ක්‍රිප්ට් අංග ඇගයීමෙන් ස්ක්‍රිප්ට් දැනටමත් පටවා නොමැති බව තහවුරු කර ගනී.

ස්ක්‍රිප්ටයක් එහි document.readyසිදුවීම ක්‍රියාත්මක වන තුරු එය සම්පූර්ණයෙන් ක්‍රියාත්මක නොවන බව මම සිතමි . (භාවිතා document.readyකිරීම අවශ්‍ය නොවන බව මම දනිමි , නමුත් බොහෝ අය එය භාවිතා කරයි, මෙය හැසිරවීම ආරක්ෂාවක් වේ.)

අතිරේක ලිපිගොනු පටවන විට document.readyඇමතුම් ආපසු වැරදි අනුපිළිවෙලින් ක්‍රියාත්මක වේ. ස්ක්‍රිප්ට් එකක් සත්‍ය වශයෙන්ම පටවන විට මෙය ආමන්ත්‍රණය කිරීම සඳහා, එය ආනයනය කළ ස්ක්‍රිප්ට් නැවත ආනයනය කර ක්‍රියාත්මක කිරීම නවතා දමයි. මෙමඟින් ආරම්භක ගොනුව document.readyආනයනය කරන ඕනෑම ස්ක්‍රිප්ට් එකකින් පසුව එහි ඇමතුම් ආපසු ලබා ගත හැක.

මෙම ප්‍රවේශය වෙනුවට ඔබට jQuery වෙනස් කිරීමට උත්සාහ කළ හැකි readyListනමුත් මෙය වඩාත් නරක විසඳුමක් සේ පෙනුනි.

විසඳුමක්:

$.extend(true,
{
    import_js : function(scriptpath, reAddLast)
    {
        if (typeof reAddLast === "undefined" || reAddLast === null)
        {
            reAddLast = true; // Default this value to true. It is not used by the end user, only to facilitate recursion correctly.
        }

        var found = false;
        if (reAddLast == true) // If we are re-adding the originating script we do not care if it has already been added.
        {
            found = $('script').filter(function () {
                return ($(this).attr('src') == scriptpath);
            }).length != 0; // jQuery to check if the script already exists. (replace it with straight JavaScript if you don't like jQuery.
        }

        if (found == false) {

            var callingScriptPath = $('script').last().attr("src"); // Get the script that is currently loading. Again this creates a limitation where this should not be used in a button, and only before document.ready.

            document.writeln("<script type='text/javascript' src='" + scriptpath + "'></script>"); // Add the script to the document using writeln

            if (reAddLast)
            {
                $.import_js(callingScriptPath, false); // Call itself with the originating script to fix the order.
                throw 'Readding script to correct order: ' + scriptpath + ' < ' + callingScriptPath; // This halts execution of the originating script since it is getting reloaded. If you put a try / catch around the call to $.import_js you results will vary.
            }
            return true;
        }
        return false;
    }
});

භාවිතය:

ගොනුව 3:

var f3obj = "file3";

// Define other stuff
$(function(){
    f3obj = "file3docready";
});

ගොනුව 2:

$.import_js('js/file3.js');
var f2obj = "file2";
$(function(){
    f2obj = "file2docready";
});

ගොනුව 1:

$.import_js('js/file2.js');

// Use objects from file2 or file3
alert(f3obj); // "file3"
alert(f2obj); // "file2"

$(function(){
    // Use objects from file2 or file3 some more.
    alert(f3obj); //"file3docready"
    alert(f2obj); //"file2docready"
});

දැනට පිළිගත් පිළිතුරෙහි සඳහන් වන්නේ මෙයයි: ප්‍රමාණවත් නොවේ.
කැනයිසයිඩ්

ප්‍රධාන වෙනස නම් පරායත්තතාවයක් නොමැති නම් එය පරායත්තතාව සඳහා ස්ක්‍රිප්ට් ටැගය එකතු කරනු ඇති අතර පසුව ඇමතුම් ගොනුව සඳහා ස්ක්‍රිප්ට් ටැගය එක් කිරීම සහ ක්‍රියාත්මක කිරීම නවත්වන දෝෂයක් විසි කිරීමයි. මෙය ස්ක්‍රිප්ට් සැකසීමට හා නිවැරදි පිළිවෙලට ක්‍රියාත්මක කිරීමට හේතු වන අතර ඇමතුම් ලබා ගැනීමේ අවශ්‍යතාවය ඉවත් කරයි. එබැවින් යැපෙන ස්ක්‍රිප්ට් කැදැල්ලට සහාය දෙන අතරතුර ඇමතුම් පිටපතට පෙර පටවා ක්‍රියාත්මක කරනු ලැබේ.
curlyhairedgenius

"වර්තමාන ප්‍රවණතාවය සමමුහුර්ත ඉල්ලීම් අවලංගු කිරීමක් ලෙස පෙනේ", මෙය සත්‍ය වන්නේ බොහෝ සංවර්ධකයින් ඒවා අනිසි ලෙස භාවිතා කර පරිශීලකයින් අනවශ්‍ය ලෙස බලා සිටින නිසාය. කෙසේ වෙතත්, ඉල්ලීම ස්වාභාවිකවම සමමුහුර්ත නම්, ඇතුළත් කිරීමේ ප්‍රකාශයක් මෙන්, සරල සමමුහුර්ත අජැක්ස් හොඳයි. PHP "සේවාදායක" ගොනුවක් ධාවනය කිරීමෙන් ජාවාස්ක්‍රිප්ට් හි කොටසක් නොවන ගොනුවක් කියවීම වැනි කාර්යයන් සමකාලීනව ක්‍රියාත්මක කරන සාමාන්‍ය ජාවාස්ක්‍රිප්ට් දිගු කිරීමේ ශ්‍රිතයක් මා විසින් නිර්මාණය කරන ලද අතර ජාවාස්ක්‍රිප්ට් භාවිතයෙන් යෙදුම් ලිවීමේදී එය ඉතා ප්‍රයෝජනවත් වේ. එවැනි අජැක්ස් සඳහා දේශීය වෙබ් සේවාදායකයක් අවශ්‍ය නොවේ.
ඩේවිඩ් ස්පෙක්ටර්

10

ජාවාස්ක්‍රිප්ට් හි මොඩියුල ක්‍රියාත්මක කිරීමට ක්‍රම කිහිපයක් තිබේ, මෙන්න වඩාත් ජනප්‍රිය ඒවා 2:

ES6 මොඩියුල

බ්‍රව්සර් තවමත් මෙම මොඩියුලිං පද්ධතියට සහය නොදක්වන බැවින් මෙම සින්ටැක්ස් භාවිතා කිරීම සඳහා ඔබ වෙබ් පැක් වැනි බණ්ඩලයක් භාවිතා කළ යුතුය. කෙසේ වෙතත්, බණ්ඩලර් භාවිතා කිරීම වඩා හොඳය, මන්දයත් මෙය ඔබගේ විවිධ ගොනු සියල්ලම තනි (හෝ යුවළකට සම්බන්ධ) ගොනු බවට ඒකාබද්ධ කළ හැකි බැවිනි. සෑම HTTP ඉල්ලීමකටම ඒ හා සම්බන්ධිත පොදු කාර්යයක් ඇති බැවින් මෙය සේවාදායකයේ සිට සේවාදායකයාට වේගයෙන් සේවා සපයනු ඇත. මේ අනුව, එච්ටීටීපී ඉල්ලීම අඩු කිරීමෙන් අපි කාර්ය සාධනය වැඩි දියුණු කරමු. ES6 මොඩියුල සඳහා උදාහරණයක් මෙන්න:

// main.js file

export function add (a, b) {
  return a + b;
}

export default function multiply (a, b) {
  return a * b;
}


// test.js file

import {add}, multiply from './main';   // for named exports between curly braces {export1, export2}
                                        // for default exports without {}

console.log(multiply(2, 2));  // logs 4

console.log(add(1, 2));  // logs 3

CommonJS (NodeJS හි භාවිතා වේ)

මෙම මොඩියුලිං ක්‍රමය NodeJS හි භාවිතා වේ. ඔබ මූලික වශයෙන් ඔබේ අපනයන නමින් හැඳින්වෙන වස්තුවකට එකතු module.exportsකරයි. එවිට ඔබට මෙම වස්තුව a හරහා ප්‍රවේශ විය හැකිය require('modulePath'). මෙහිදී වැදගත් වන්නේ මෙම මොඩියුලයන් හැඹිලිගත කර ඇති බව වටහා ගැනීමයි, එබැවින් ඔබ require()යම් මොඩියුලයක් දෙවරක් කළහොත් එය දැනටමත් නිර්මාණය කර ඇති මොඩියුලය නැවත ලබා දෙනු ඇත.

// main.js file

function add (a, b) {
  return a + b;
}

module.exports = add;  // here we add our add function to the exports object


// test.js file

const add = require('./main'); 

console.log(add(1,2));  // logs 3

9

මම මෙම ප්‍රශ්නයට පැමිණියේ ප්‍රයෝජනවත් ජාවාස්ක්‍රිප්ට් ප්ලගීන එකතුවක් පවත්වා ගැනීමට සරල ක්‍රමයක් සොයන බැවිනි. මෙහි ඇති විසඳුම් කිහිපයක් දැකීමෙන් පසු, මම මෙය ඉදිරිපත් කළෙමි:

  1. "Plugins.js" (හෝ extension.js හෝ ඔබට අවශ්‍ය ඕනෑම දෙයක්) නමින් ගොනුවක් සකසන්න. ඔබේ ප්ලගීන ලිපිගොනු එක ප්‍රධාන ගොනුවක් සමඟ තබා ගන්න.

  2. plugins.js හි අරාව ඇත, එය pluginNames[]අප නැවත කියනු ඇත each(), ඉන්පසු <script>එක් එක් ප්ලගිනය සඳහා හිසට ටැගයක් එක් කරන්න

//set array to be updated when we add or remove plugin files
var pluginNames = ["lettering", "fittext", "butterjam", etc.];

//one script tag for each plugin
$.each(pluginNames, function(){
    $('head').append('<script src="js/plugins/' + this + '.js"></script>');
});
  1. ඔබේ හිසෙහි ඇති එක් ගොනුවක් පමණක් අතින් අමතන්න:
    <script src="js/plugins/plugins.js"></script>

එහෙත්:

සියලුම ප්ලගීන ඔවුන් කළ යුතු ආකාරයට හෙඩ් ටැග් එකට දැමුවද, ඔබ පිටුවට ක්ලික් කළ විට හෝ නැවුම් කළ විට ඒවා සැමවිටම බ්‍රව්සරය මඟින් ක්‍රියාත්මක නොවේ.

PHP ඇතුළත් ස්ක්‍රිප්ට් ටැග් ලිවීම වඩා විශ්වාසදායක බව මට පෙනී ගියේය. ඔබට එය ලිවිය යුත්තේ එක් වරක් පමණක් වන අතර එය ජාවාස්ක්‍රිප්ට් භාවිතයෙන් ප්ලගිනය ඇමතීම තරම්ම කාර්යයකි.


ill ඔබේ විසඳුම මට වඩා පිරිසිදු බව පෙනේ .මම භාවිතා කරන්නේ නම් .append () භාවිතා කරන බැවින් මට යම් දෝෂ ඇතිවිය හැකි යැයි මම කණගාටු වෙමි. එබැවින් මෙය භාවිතා කිරීම සඳහා, ඔබ ඇතුළත් කිරීමට බලාපොරොත්තු වන එක් එක් ප්ලගීන ගොනුව සඳහා එක් වරක් එම ශ්‍රිතය ඇමතිය හැකිද?
rgb_life
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.