2009-06-12 13 views
31

क्या वर्तमान में निष्पादित जावास्क्रिप्ट फ़ाइल (वेब ​​पेज के अंदर) के यूआरएल को निर्धारित करने का एक सरल और विश्वसनीय तरीका है?मेरी लिपि src URL क्या है?

इस पर मेरा एकमात्र विचार सभी स्क्रिप्ट src गुणों के लिए डीओएम को स्कैन करना है ताकि यह पता चल सके कि वर्तमान फ़ाइल का संदर्भ कैसे दिया गया था और फिर इसे document.location पर लागू करके पूर्ण URL को समझें। किसी के पास अन्य विचार हैं, क्या कुछ सुपर-आसान तरीका है जिसे मैंने पूरी तरह से अनदेखा किया है?

अद्यतन: DOM के माध्यम से एक्सेस किए गए स्क्रिप्ट तत्वों में पहले से ही src संपत्ति है जिसमें पूरा यूआरएल है। मुझे नहीं पता कि सर्वव्यापी/मानक कैसे है, लेकिन वैकल्पिक रूप से आप getAttribute("src") का उपयोग कर सकते हैं जो [X] HTML में जो भी कच्चा गुण मान वापस करेगा।

+0

संभव डुप्लिकेट [कैसे मुझे लगता है कि स्क्रिप्ट के भीतर से स्क्रिप्ट फ़ाइल नाम मिल सकता है?] (Http://stackoverflow.com/questions/710957/how-might-i-get-the -स्क्रिप्ट-फ़ाइल नाम-से-भीतर-उस-स्क्रिप्ट) – Bergi

उत्तर

40

इसे जेएस फ़ाइल में रखें जिसे इसे अपना यूआरएल पता होना चाहिए।

पूरी तरह से योग्य (जैसे http://www.example.com/js/main.js):

var scriptSource = (function(scripts) { 
    var scripts = document.getElementsByTagName('script'), 
     script = scripts[scripts.length - 1]; 

    if (script.getAttribute.length !== undefined) { 
     return script.src 
    } 

    return script.getAttribute('src', -1) 
}()); 

या यह स्रोत (जैसे /js/main.js) में प्रकट होता है के रूप में:

var scriptSource = (function() { 
    var scripts = document.getElementsByTagName('script'), 
     script = scripts[scripts.length - 1]; 

    if (script.getAttribute.length !== undefined) { 
     return script.getAttribute('src') 
    } 

    return script.getAttribute('src', 2) 
}()); 

getAttribute पैरामीटर होने का विवरण के लिए http://www.glennjones.net/Post/809/getAttributehrefbug.htm देखें इस्तेमाल किया (यह एक आईई बग है)।

+0

बढ़िया बढ़िया! धन्यवाद! –

+1

पूरी तरह योग्यता प्राप्त करने के लिए आप सिर्फ script.src का उपयोग नहीं कर सकते हैं? आप script.getAttribute ('src', -1) का उपयोग क्यों कर रहे हैं ??? –

+9

ग्रेट उत्तर। एक चेतावनी - यह स्क्रिप्ट आलसी लोड है (किसी अन्य स्क्रिप्ट द्वारा डोम में इंजेक्शन), यह डोम में आखिरी लिपि नहीं होगी, इसलिए यह सटीक स्निपेट काम नहीं करेगा। – ripper234

0

यदि यह सख्ती से ग्राहक समाधान है, तो आपका बहुत अच्छा लगता है।

यदि आप सर्वर पर कोड लिख रहे हैं, तो संभवतः आप स्क्रिप्ट के पूरी तरह से हल किए गए यूआरएल के साथ एक div/hidden field/(अपना फव एचटीएमएल तत्व डालें) को पॉप्युलेट कर सकते हैं, और इसे अपने जावास्क्रिप्ट पर उठाएं ग्राहक की ओर।

+0

सर्वर की तरफ, वह सिर्फ जेएस ट्रॉफ एएसपी/पीएचपी/जेएसपी/सीजीआई की सेवा कर सकता है और वहां से जावास्क्रिप्ट में यूआरएल आउटपुट कर सकता है। – ZJR

+0

@ZJR - मैं वर्तमान में "जेएस ट्रफ" के विचार का आनंद ले रहा हूं, हालांकि यह परोसा जाता है;) – simon

0

यदि आप सीखने में रुचि रखते हैं कि कौन से फ़ंक्शंस (और इस प्रकार कौन सी फ़ाइल) उस पृष्ठ पर निष्पादित कर रहे हैं जिस पर आप नियंत्रण नहीं करते हैं तो आप https://addons.mozilla.org/en-US/firefox/addon/10345 पर एक नज़र डालना चाहते हैं।

यदि आप में से स्क्रिप्ट निष्पादित कर रहे हैं, तो यह पता लगाने में रुचि रखते हैं, तो कई तरीके हैं। फायरबग के साथ आप console.log() जानकारी प्राप्त कर सकते हैं। यहां तक ​​कि अपने कोड में चेतावनी बयान डालने (यहां तक ​​कि कष्टप्रद) कम तकनीक वाले तरीके से डीबग करने में मदद कर सकते हैं। आप त्रुटियों को भी उठा सकते हैं और उन्हें पकड़ सकते हैं, फिर त्रुटि के गुणों का उपयोग कर प्रक्रिया (देखें: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error)

हालांकि, यह क्यों महत्वपूर्ण होगा? यदि स्क्रिप्ट पहले से ही त्रुटियों का कारण बन रही है तो यह निर्धारित करने में काफी आसान है कि त्रुटि कहां हो रही है। यदि यह त्रुटियों के बारे में नहीं है, तो यह जानने में क्या फायदा है कि फ़ाइल यह कहां से आता है?

+0

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

+0

उस मामले में, जो आपने ऊपर प्रस्तावित किया वह एकमात्र समाधान है जो वास्तव में उपलब्ध है। –

6

यह स्रोत (जैसे /js/main.js) में प्रकट होता है के रूप में, इस क्रॉस-ब्राउज़र है:

var scriptSource = (function() 
{ 
    var scripts = document.getElementsByTagName('script'), 
     script = scripts[scripts.length - 1]; 

    //No need to perform the same test we do for the Fully Qualified 
    return script.getAttribute('src', 2); //this works in all browser even in FF/Chrome/Safari 
}()); 

पूरी तरह से योग्य (जैसेhttp://www.example.com/js/main.js):

कुछ परीक्षणों के बाद एक क्रॉस-ब्राउज़र तरीके से पूरी तरह से योग्यता प्राप्त करना मुश्किल लगता है। solution suggested by Crescent Fresh, IE8 में काम नहीं करता है पूरी तरह से योग्य पाने के लिए भले ही यह IE7

4

में स्थगित करें, async और आलसी लोड हो रहा है साथ इस पद्धति का काम काम करता है के बाद से आप अपनी स्क्रिप्ट के फ़ाइल नाम पता है, और अगर यह हो जाएगा इसके साथ अद्वितीय

/* see 
* http://stackoverflow.com/questions/984510/what-is-my-script-src-url/984656#984656 
* http://www.glennjones.net/Post/809/getAttributehrefbug.htm 
* 
* iterate all script to find script with right filename 
* this work with async and defer (but your script MUST have a unique filemane) 
* mozilla support document.currentScript and we use it, if is set 
* 
* this will not work with local script loaded by jQuery.getScript(), 
* since there is no script tag added into the dom. the script is only evaluated in global space. 
* http://api.jquery.com/jQuery.getScript/ 
* 
* to fix this odd, you can add a reference in meta (meta[name=srcipt][content=url]) 
* when you load the script 
*/ 
var scriptFilename = 'jquery.plugins.template.js'; // don't forget to set the filename 
var scriptUrl = (function() { 
    if (document.currentScript) { // support defer & async (mozilla only) 
     return document.currentScript.src; 
    } else { 
     var ls,s; 
     var getSrc = function (ls, attr) { 
      var i, l = ls.length, nf, s; 
      for (i = 0; i < l; i++) { 
       s = null; 
       if (ls[i].getAttribute.length !== undefined) { 
        s = ls[i].getAttribute(attr, 2);      
       }    
       if (!s) continue; // tag with no src 
       nf = s; 
       nf = nf.split('?')[0].split('/').pop(); // get script filename 
       if (nf === scriptFilename) { 
        return s; 
       } 
      } 
     };   
     ls = document.getElementsByTagName('script'); 
     s = getSrc(ls, 'src'); 
     if (!s) { // search reference of script loaded by jQuery.getScript() in meta[name=srcipt][content=url] 
      ls = document.getElementsByTagName('meta');    
      s = getSrc(ls, 'content'); 
     }   
     if (s) return s; 
    } 
    return ''; 
})(); 

var scriptPath = scriptUrl.substring(0, scriptUrl.lastIndexOf('/'))+"/"; 

एक jQuery प्लगइन टेम्पलेट: https://github.com/mkdgs/mkdgs-snippet/blob/master/javascript/jquery.plugins.template.js

ध्यान दें: इस,) jQuery.getScript (द्वारा लोड स्थानीय स्क्रिप्ट के साथ काम नहीं करेगा क्योंकि वहाँ कोई स्क्रिप्ट नहीं टैग डोम में जोड़ा है। स्क्रिप्ट का मूल्यांकन केवल वैश्विक अंतरिक्ष में किया जाता है। http://api.jquery.com/jQuery.getScript/

इसे ठीक करने के लिए आप की तरह कुछ कर सकते हैं:

function loadScript(url,callback) {  

    if ($('[src="'+url+'"]').length) return true; // is already loaded  

    // make a reference of the loaded script 
    if ($('meta[content="'+url+'"]', $("head")).length) return true; // is already loaded 
    var meta = document.createElement('meta'); 
    meta.content = url; 
    meta.name = 'script'; 
    $("head").append(meta); 

    return $.ajax({ 
      cache: true, 
      url: u, 
      dataType: 'script', 
      async: false, 
      success : function (script) {      
       try { 
        if (typeof callback == 'function') callback();  
       } catch (error) { 
        //console.log(error); 
       } 
      } 
    }); 
} 
+0

यहां 'document.currentScript' का दिलचस्प उपयोग। अफसोस की बात है, ब्राउज़र समर्थन जानकारी http://caniuse.com पर उपलब्ध नहीं है। आप खुले मुद्दे को ऊपर उठाकर मदद कर सकते हैं: http://github.com/Fyrd/caniuse/issues/1099। – Stephan

+0

मैंने इसके लिए वोट दिया है लेकिन caniuse.com एकमात्र सूचना स्रोत नहीं है। https://developer.mozilla.org/en-US/docs/Web/API/Document/currentScript – Mkdgs

29

हाल ब्राउज़रों के लिए, आप document.currentScript का उपयोग यह जानकारी प्राप्त कर सकते हैं।

var mySource = document.currentScript.src; 

उल्टा यह है कि यह क्षैतिज रूप से लोड की गई स्क्रिप्ट के लिए अधिक विश्वसनीय है। नकारात्मकता यह है कि यह सबसे अच्छा नहीं है, सार्वभौमिक रूप से समर्थित है। इसे क्रोम> = 2 9, फ़ायरफ़ॉक्स> = 4, ओपेरा> = 16. पर काम करना चाहिए। कई उपयोगी चीजों की तरह, यह आईई में काम नहीं कर रहा है।

जब मुझे स्क्रिप्ट पथ प्राप्त करने की आवश्यकता होती है, तो मैं यह देखने के लिए जांच करता हूं कि document.currentScript परिभाषित किया गया है, और यदि नहीं, तो स्वीकृत उत्तर में वर्णित विधि का उपयोग करें।

if (document.currentScript) { 
    mySource = document.currentScript.src; 
} else { 
    // code omitted for brevity 
} 

https://developer.mozilla.org/en-US/docs/Web/API/document.currentScript

की
+0

http://caniuse.com इस सुविधा की अभी तक निगरानी नहीं करता है। आप यहां एक उपरोक्त सहायता के साथ मदद कर सकते हैं: http://github.com/Fyrd/caniuse/issues/1099। – Stephan

संबंधित मुद्दे