2010-11-13 25 views
36

मैं JavaScript फ़ाइलों है कि मैं पेज में शामिल करना चाहते हैं का एक समूह है, लेकिन मैं तो वहाँ एक तरह से एक निर्देशिका में सभी फ़ाइलें (शामिल करने के लिए हैमैं जावास्क्रिप्ट फ़ाइल के माध्यम से निर्देशिका में सभी जावास्क्रिप्ट फ़ाइलों को कैसे शामिल कर सकता हूं?

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

लेखन रखने के लिए नहीं करना चाहते हैं अज्ञात आकार)? क्या मैं कुछ ऐसा कर सकता हूं ...

$.getScript("js/*.js"); 

... "जेएस" निर्देशिका में सभी जावास्क्रिप्ट फ़ाइलों को प्राप्त करने के लिए? मैं jQuery का उपयोग करके यह कैसे कर सकता हूं?

उत्तर

24

सामान्यतः, यह शायद एक अच्छा विचार नहीं है, क्योंकि आपकी एचटीएमएल फाइल केवल जेएस फाइलों को लोड करनी चाहिए जो वे वास्तव में उपयोग करते हैं। भले ही, किसी सर्वर-साइड स्क्रिप्टिंग भाषा के साथ ऐसा करना मुश्किल होगा। क्लाइंट को पृष्ठों की सेवा करने से पहले बस स्क्रिप्ट टैग डालें।

आप सर्वर-साइड स्क्रिप्टिंग का उपयोग कर, आप अपने जे एस निर्देशिका सामग्री लिस्टिंग की अनुमति देता है कि, और फिर XMLHttpRequest का उपयोग निर्देशिका की सामग्री को पढ़ने के लिए एक निर्देशिका में फ़ाइलों को छोड़ सकता है बिना यह करते हैं, और फ़ाइल को पार्स आउट करना चाहते हैं नाम और उन्हें लोड करें।

विकल्प # 3 एक "लोडर" जेएस फ़ाइल है जो अन्य सभी फ़ाइलों को लोड करने के लिए getScript() का उपयोग करता है। अपने सभी एचटीएमएल फाइलों में एक स्क्रिप्ट टैग में रखें, और फिर जब भी आप एक नई स्क्रिप्ट अपलोड करते हैं तो आपको लोडर फ़ाइल को अपडेट करने की आवश्यकता होती है।

+0

मुझे लगता है कि ओपी सर्वर-साइड स्क्रिप्टिंग के बिना क्या करना चाहता है यह करने का यही एकमात्र तरीका है।लेकिन मैं सहमत हूं, यह बेहतर से बचा है। – harpo

+0

मुझे विकल्प # 3 पसंद है और मैं मानता हूं कि यह एक अच्छा विकल्प नहीं है। हालांकि, मैं इसे पहले काम करने के लिए प्राप्त करना चाहता हूं :) तो मैं निर्देशिका में * सभी * फ़ाइलों को प्राप्त करने के लिए '.getScript()' का उपयोग कैसे करूं? क्या आप कुछ कोड प्रदान कर सकते हैं? – Hristo

+0

हिस्टो, मेरा मतलब है कि आप निर्देशिका में प्रत्येक जावास्क्रिप्ट फ़ाइल के लिए एक getScrip() कॉल कर सकते हैं, फिर प्रत्येक बार एक नई प्रविष्टि को निर्देशिका में जोड़ा जाने पर एक नई प्रविष्टि जोड़ें। –

21

स्क्रिप्ट टैग लाइन जेनरेट करने के लिए सर्वर-साइड स्क्रिप्ट का उपयोग करने के बारे में क्या? Crudely, इस (PHP) की तरह कुछ -

$handle=opendir("scripts/"); 

while (($file = readdir($handle))!==false) { 
echo '<script type="text/javascript" src="$file"></script>'; 
} 

closedir($handle); 
+0

हाँ ... मैं एक अंतिम उपाय के रूप में उपयोग करना चाहते हैं। मैं इस समय PHP का उपयोग नहीं करना पसंद करता हूं। – Hristo

+0

मुझे नहीं लगता कि यह जावास्क्रिप्ट में संभव है क्योंकि इसकी किसी भी फाइल सिस्टम तक पहुंच नहीं है। शायद एक ActiveX ऑब्जेक्ट, लेकिन शायद उपयोगकर्ता इसे पसंद नहीं करेंगे। – jellyfishtree

2

आप ऐसा नहीं कर सकते कि जावास्क्रिप्ट में, के बाद से जे एस ब्राउज़र में निष्पादित किया जाता है, नहीं सर्वर में, तो यह निर्देशिका बारे में कुछ भी पता नहीं था या अन्य सर्वर संसाधन।

सबसे अच्छा विकल्प जेलीफ़िशट्री द्वारा पोस्ट की गई एक सर्वर साइड स्क्रिप्ट का उपयोग कर रहा है।

+0

jQuery '.getScript()' फ़ंक्शन कैसे काम करता है? – Hristo

+2

उम्म, getScript को स्क्रिप्ट के पथ की आवश्यकता है, है ना? कोई जादू नहीं है – harpo

+0

आप जेएस से निजी सर्वर संसाधनों तक नहीं पहुंच सकते हैं जब तक कि कुछ सर्वर साइड स्क्रिप्ट, अवधि के साथ उपयोग नहीं किया जाता है। उन्हें विभिन्न स्थानों पर निष्पादित किया जाता है (क्लाइंट में एक और दूसरा सर्वर पर)। –

11

यह देखते हुए कि आप एक 100% ग्राहक के पक्ष समाधान चाहते हैं, सिद्धांत रूप में आप शायद ऐसा कर सकता है:

वाया XmlHttpRequest, कि निर्देशिका के लिए निर्देशिका प्रविष्टि पृष्ठ मिलता है (लगभग सभी वेब सर्वरों फ़ाइलों की एक सूची लौट अगर कोई है निर्देशिका में कोई index.html फ़ाइल नहीं)।

पार्स जो जावास्क्रिप्ट के साथ फ़ाइल करता है, सभी .js फ़ाइलों को खींचता है। यह निश्चित रूप से आपके वेब सर्वर/वेब होस्ट पर निर्देशिका सूची के प्रारूप के प्रति संवेदनशील होगा।

स्क्रिप्ट जोड़ें गतिशील टैग किए जाने कुछ इस तरह के साथ:

function loadScript (dir, file) { 
var scr = document.createElement("script"); 
scr.src = dir + file; 
document.body.appendChild(scr); 
} 
+0

अच्छा लगता है ... मैं एक सर्वर साइड स्क्रिप्ट का उपयोग करूंगा। धन्यवाद! रचनात्मकता के लिए – Hristo

+0

+1 :) –

1

यह @jellyfishtree एक बेहतर होगा यदि आप एक PHP फ़ाइल में आपके सभी js निर्देशिका से फ़ाइलों को भी शामिल है और उसके बाद ही इस php शामिल बनाने एक स्क्रिप्ट टैग के माध्यम से फ़ाइल। इसका बेहतर प्रदर्शन है क्योंकि ब्राउज़र को सर्वर से कम अनुरोध करना पड़ता है। देखें:

javascripts.php:

<?php 
    //sets the content type to javascript 
    header('Content-type: text/javascript'); 

    // includes all js files of the directory 
    foreach(glob("packages/*.js") as $file) { 
     readfile($file); 
    } 
?> 


सूचकांक।php:

<script type="text/javascript" src="javascripts.php"></script> 

यही है!
मज़े करो! :)

1

यह पूरी तरह से ग्राहक पक्ष किया जा सकता है, लेकिन सभी जावास्क्रिप्ट फ़ाइल नामों को निर्दिष्ट किया जाना चाहिए। उदाहरण के लिए, सरणी आइटम के रूप में:

function loadScripts(){ 
    var directory = 'script/'; 
    var extension = '.js'; 
    var files = ['model', 'view', 'controller']; 
    for (var file of files){ 
     var path = directory + file + extension; 
     var script = document.createElement("script"); 
     script.src = path; 
     document.body.appendChild(script); 
    } 
} 
+0

ने आपके त्वरित उत्तर को पसंद किया, और इसे थोड़ा नीचे ट्यून किया, मुझे लगता है कि आपको सिर पर स्क्रिप्ट जोड़ने की ज़रूरत नहीं है, धन्यवाद –

1

आप ब्राउज़र से कर सकते हैं नहीं है कि जावास्क्रिप्ट में ... अगर मैं तुम्हें थे, मैं browserify की तरह कुछ का प्रयोग करेंगे। कॉमनज मॉड्यूल का उपयोग करके अपना कोड लिखें और फिर जावास्क्रिप्ट फ़ाइल को संकलित करें।

आपके एचटीएमएल लोड में जावास्क्रिप्ट फ़ाइल जिसे आपने संकलित किया है।

3

आप Grunt Include Source जैसे कुछ का उपयोग कर सकते हैं। यह आपको एक अच्छा वाक्यविन्यास देता है जो आपके एचटीएमएल को प्रीप्रोकैस करता है, और फिर जो कुछ भी आप चाहते हैं उसे शामिल करता है। इसका मतलब यह भी है कि, यदि आप अपने निर्माण कार्यों को सही तरीके से सेट अप करते हैं, तो आप इन सभी को देव मोड में शामिल कर सकते हैं, लेकिन प्रोड मोड में नहीं, जो कि बहुत अच्छा है।

यदि आप अपनी परियोजना के लिए ग्रंट का उपयोग नहीं कर रहे हैं, तो शायद गुलप, या अन्य कार्य धावकों के लिए समान उपकरण हैं।

+1

यदि प्रश्न पूछा गया तो यह स्वीकार्य उत्तर होगा आज –

0

मैं इस प्रश्न का उत्तर ढूंढ रहा था और मेरी अपनी समस्याएं थीं। मुझे विभिन्न स्थानों में कुछ समाधान मिले और उन्हें अपने पसंदीदा उत्तर में एक साथ रखा।

function exploreFolder(folderURL,options){ 
/* options:     type   explaination 

    **REQUIRED** callback: FUNCTION  function to be called on each file. passed the complete filepath 
    then:     FUNCTION  function to be called after loading all files in folder. passed the number of files loaded 
    recursive:    BOOLEAN   specifies wether or not to travel deep into folders 
    ignore:     REGEX   file names matching this regular expression will not be operated on 
    accept:     REGEX   if this is present it overrides the `ignore` and only accepts files matching the regex 
*/ 
$.ajax({ 
    url: folderURL, 
    success: function(data){ 
     var filesLoaded = 0, 
     fileName = ''; 

     $(data).find("td > a").each(function(){ 
      fileName = $(this).attr("href"); 

      if(fileName === '/') 
       return; //to account for the (go up a level) link 

      if(/\/\//.test(folderURL + fileName)) 
       return; //if the url has two consecutive slashes '//' 

      if(options.accept){ 
       if(!options.accept.test(fileName)) 
        //if accept is present and the href fails, dont callback 
        return; 
      }else if(options.ignore) 
       if(options.ignore.test(fileName)) 
        //if ignore is present and the href passes, dont callback 
        return; 

      if(fileName.length > 1 && fileName.substr(fileName.length-1) === "/") 
       if(options.recursive) 
        //only recurse if we are told to 
        exploreFolder(folderURL + fileName, options); 
       else 
        return; 

      filesLoaded++; 
      options.callback(folderURL + fileName); 
      //pass the full URL into the callback function 
     }); 
     if(options.then && filesLoaded > 0) options.then(filesLoaded); 
    } 
}); 
} 

तो फिर तुम इसे इस तरह कॉल कर सकते हैं:

var loadingConfig = { 
    callback: function(file) { console.log("Loaded file: " + file); }, 
    then: function(numFiles) { console.log("Finished loading " + numFiles + " files"); }, 
    recursive: true, 
    ignore: /^NOLOAD/, 
}; 
exploreFolder('/someFolderURL/', loadingConfig); 

यह उदाहरण है कि कॉलबैक जो कि NOLOAD के साथ शुरू करने के लिए छोड़कर निर्दिष्ट फ़ोल्डर में हर फ़ाइल/फ़ोल्डर को कॉल करेंगे। यदि आप वास्तव में पृष्ठ में फ़ाइल को लोड करना चाहते हैं तो आप इस अन्य सहायक फ़ंक्शन का उपयोग कर सकते हैं जिसे मैंने विकसित किया था।

function getFileExtension(fname){ 
    if(fname) 
     return fname.substr((~-fname.lastIndexOf(".") >>> 0) + 2); 
    console.warn("No file name provided"); 
} 
var loadFile = (function(filename){ 
    var img = new Image(); 

    return function(){ 
     var fileref, 
      filename = arguments[0], 
      filetype = getFileExtension(filename).toLowerCase(); 

     switch (filetype) { 
      case '': 
       return; 
      case 'js': 
       fileref=document.createElement('script'); 
       fileref.setAttribute("type","text/javascript"); 
       fileref.setAttribute("src", filename); 
       break; 
      case "css": 
       fileref=document.createElement("link"); 
       fileref.setAttribute("rel", "stylesheet"); 
       fileref.setAttribute("type", "text/css"); 
       fileref.setAttribute("href", filename); 
       break; 
      case "jpg": 
      case "jpeg": 
      case 'png': 
      case 'gif': 
       img.src = filename; 
       break; 
      default: 
       console.warn("This file type is not supported: "+filetype); 
       return; 
     } 
     if (typeof fileref !== undefined){ 
      $("head").append(fileref); 
      console.log('Loaded file: ' + filename); 
     } 
    } 
})(); 

यह फ़ंक्शन एक जेएस स्वीकार करता है। सीएसएस | (सामान्य छवि) फ़ाइल और इसे लोड करता है। यह जेएस फाइलों को भी निष्पादित करेगा। पूरा कॉल की जरूरत है कि सभी छवियों और * स्टाइलशीट और अन्य लिपियों लोड करने के लिए ऐसा दिखाई दे सकता अपनी स्क्रिप्ट में चलाने के लिए:

loadingConfig = { 
    callback: loadfile, 
    then: function(numFiles) { console.log("Finished loading " + numFiles + " files"); }, 
    recursive: true, 
    ignore: /^NOLOAD/, 
}; 
exploreFolder('/someFolderURL/', loadingConfig); 

यह आश्चर्यजनक काम करता है!

+0

यह एक चेतावनी है कि सर्वर को इसकी निर्देशिका में फ़ाइलों की एक सूची प्रकाशित करने की आवश्यकता है। आपकी सर्वर सेटिंग्स में कहीं भी एक सेटिंग है जो इसे अनुमति देती है, अगर यह अक्षम है तो सर्वर साइड कोड के बिना आप जो चाहते हैं उसे प्राप्त करना सचमुच असंभव है। – Frozenfrank

+0

यह फ़ाइलों की सूची लोड करने के लिए jQuery पर भी निर्भर है ('एक्सप्लोरफ़ोल्डर' के अंदर) और फिर फ़ाइलों को लोड करें ('loadFile' के अंदर)। – Frozenfrank

0

एक अन्य विकल्प है कि बहुत कम है:

<script type="text/javascript"> 
$.ajax({ 
    url: "/js/partials", 
    success: function(data){ 
    $(data).find('a:contains(.js)').each(function(){ 
     // will loop through 
     var partial= $(this).attr("href"); 
     $.getScript("/js/partials/" + partial, function(data, textStatus, jqxhr) {}); 
    }); 
    } 
}); 
</script>