जावास्क्रिप्ट - मुझे स्क्रिप्ट का URL कैसे कहा जाता है?


81

मैं myscript.js को http://site1.com/index.htmlइस तरह फ़ाइल में शामिल करता हूं :

<script src=http://site2.com/myscript.js></script>

"Myscript.js" के अंदर, मैं " http://site2.com/myscript.js " URL तक पहुँच प्राप्त करना चाहता हूँ । मैं इस तरह से कुछ करना चाहता हूं:

function getScriptURL() {
    // something here
    return s
}

alert(getScriptURL());

यदि ऊपर उल्लिखित index.html से कहा जाता है तो " http://site2.com/myscript.js " को सचेत करेगा ।




आपके उदाहरण URL के आधार पर, आप यह नोट करना चाह सकते हैं कि यदि ब्राउज़र तृतीय पक्ष स्क्रिप्ट को ब्लॉक करने के लिए सेट है तो आप किस व्यवहार की अपेक्षा कर रहे हैं।

जवाबों:


58

से http://feather.elektrum.org/book/src.html :

var scripts = document.getElementsByTagName('script');
var index = scripts.length - 1;
var myScript = scripts[index];

चर में myScriptअब स्क्रिप्ट डोम तत्व है। आप उपयोग करके src url प्राप्त कर सकते हैं myScript.src।

ध्यान दें कि यह स्क्रिप्ट के प्रारंभिक मूल्यांकन के भाग के रूप में निष्पादित करने की आवश्यकता है। यदि आप जावास्क्रिप्ट नाम स्थान को प्रदूषित नहीं करना चाहते हैं तो आप कुछ ऐसा कर सकते हैं:

var getScriptURL = (function() {
    var scripts = document.getElementsByTagName('script');
    var index = scripts.length - 1;
    var myScript = scripts[index];
    return function() { return myScript.src; };
})();

23
क्या यह हमेशा सही स्क्रिप्ट का URL लौटाएगा, हालांकि सभी ब्राउज़रों में? ऐसा लगता है कि यह पिछले स्क्रिप्ट टैग को वापस कर देगा, लेकिन क्या होगा यदि दस्तावेज़ में एक से अधिक स्क्रिप्ट टैग हैं?
— मिकक 8

3
ठीक है ... मेरा प्रश्न तब बन जाता है, क्या सभी ब्राउज़र हमेशा अगली स्क्रिप्ट टैग पर जाने से पहले किसी दूरस्थ स्क्रिप्ट की पूरी सामग्री को पूरी तरह से लोड करते हैं? यह मानकीकृत कितना कठोर है? मैं इसके समानांतर होने की कल्पना कर सकता था ...
— माइक ०C

1
यह आवश्यक है कि स्क्रिप्ट पूरी तरह से और क्रम में चलती है क्योंकि स्क्रिप्ट टैग में कोई दस्तावेज़ होने पर क्या होगा। यह पृष्ठ के निचले भाग में स्क्रिप्ट लगाने की सिफारिशों का कारण है क्योंकि वे वास्तव में लोडिंग से अन्य सामग्री को अवरुद्ध करेंगे। उस ने कहा, एचटीएमएल 5 यह बताता है कि एसिंक्स
— lambacck

9
यदि आप पृष्ठ को इस तरह से लोड करने के बाद स्क्रिप्ट लोड करते हैं तो यह काम नहीं करता है: document.getElementsByTagName("head")[0].appendChild(scriptElement);
— Seanonym

16
मैं एक ऐसे मामले में आया हूँ जहाँ यह एल्गोरिथ्म मज़बूती से काम नहीं करता है। अन्य स्क्रिप्ट टैग जो async पर सेट किए गए हैं, आपके स्क्रिप्ट के अनुरोध और चलाने के बीच चल सकते हैं। ये स्क्रिप्ट डोम के बाद अन्य स्क्रिप्ट जोड़ सकती हैं जो आपके बाद दिखाई देती हैं। जब आपकी स्क्रिप्ट पृष्ठ पर अंतिम स्क्रिप्ट चलाती है तो वह आपकी नहीं होती है और गलत srcवापस आ जाती है।
— कार्ल

54

आप अपने स्क्रिप्ट टैग में आईडी विशेषता जोड़ सकते हैं (भले ही वह हेड टैग के अंदर हो):

<script id="myscripttag" src="http://site2.com/myscript.js"></script>

और फिर इसके src तक पहुँच इस प्रकार है:

document.getElementById("myscripttag").src

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


1
इस उत्तर को "स्वीकृत" के रूप में चिह्नित किया जाना चाहिए क्योंकि यह उन मामलों को कवर करता है जब आप विधि को "वैश्विक" स्क्रिप्ट संदर्भ में या "async" स्क्रिप्ट में नहीं कहते हैं, और यह ब्राउज़र कार्यान्वयन पर निर्भर नहीं करता है।
— सर्गेई कोवलेंको

ध्यान दें कि .srcएक निरपेक्ष पथ वापस आ सकता है, भले ही एक रिश्तेदार पथ निर्दिष्ट किया गया हो। आप का उपयोग कर सकते हैं.getAttribute('src')
— Илья Зеленько


18

मैंने लिपियों का मार्ग खोजने के लिए एक वर्ग लिखा था जो विलंबित लोडिंग और एसिंक्स स्क्रिप्ट टैग के साथ काम करता है।

मेरे पास कुछ टेम्प्लेट फाइलें थीं जो मेरी लिपियों के सापेक्ष थीं इसलिए हार्ड कोडिंग के बजाय मैंने अपने आप ही पथ बनाने के लिए कक्षा बनाई। पूरा स्रोत गितुब पर है।

कुछ समय पहले मैंने तर्कों का उपयोग किया था। प्रयास करें और ऐसा ही कुछ करें लेकिन मैंने हाल ही में एमडीएन पर पढ़ा कि इसे सख्त मोड में अनुमति नहीं है ।

function ScriptPath() {
  var scriptPath = '';
  try {
    //Throw an error to generate a stack trace
    throw new Error();
  }
  catch(e) {
    //Split the stack trace into each line
    var stackLines = e.stack.split('\n');
    var callerIndex = 0;
    //Now walk though each line until we find a path reference
    for(var i in stackLines){
      if(!stackLines[i].match(/http[s]?:\/\//)) continue;
      //We skipped all the lines with out an http so we now have a script reference
      //This one is the class constructor, the next is the getScriptPath() call
      //The one after that is the user code requesting the path info (so offset by 2)
      callerIndex = Number(i) + 2;
      break;
    }
    //Now parse the string for each section we want to return
    pathParts = stackLines[callerIndex].match(/((http[s]?:\/\/.+\/)([^\/]+\.js)):/);
  }

  this.fullPath = function() {
    return pathParts[1];
  };

  this.path = function() {
    return pathParts[2];
  };

  this.file = function() {
    return pathParts[3];
  };

  this.fileNoExt = function() {
    var parts = this.file().split('.');
    parts.length = parts.length != 1 ? parts.length - 1 : 1;
    return parts.join('.');
  };
}

1
यहाँ पार्टी में थोड़ी देर हो गई, लेकिन मैं इस कोड को स्निपेट के रूप में आज़मा रहा था और पाया कि यह वह भाग है जहाँ यह लूप के लिए वर्तमान सूचकांक में 2 जोड़ता है "callerIndex = Number (i) + 2;" लगता है कि यह अनावश्यक है और काम नहीं करने का कारण बनता है। बस "+ 2" को खत्म करने से यह काम कर रहा है। क्या ऐसा कुछ है जो मैं गलत समझ रहा हूँ या कोई और परिदृश्य है जो कि + 2 के लिए आवश्यक होगा?
— स्कॉट स्मिथ

2
आपको इस तरह से "त्रुटि" फेंकने की आवश्यकता नहीं है (इसे ".stack" पाने के लिए) यह दूसरों की तरह ही एक ऑब्जेक्ट है: कंसोल.लॉग (नई त्रुटि () स्टैक)।
— अब्दुल्ला 16

1
इस विचार के लिए धन्यवाद, और एक फेंक को रोकने के विचार के लिए @ अब्दुल्लाहाइडन को धन्यवाद। फिर मुझे लगता है कि निम्नलिखित एक-लाइनर चाल होगा, है ना? var scriptUrl = नई त्रुटि ()। स्टैचमैच (/ @ (https ;: \ / \ / /+): \ d +: \ d + /) [1]
— पियरे-एंटोनी

1
इसके अलावा @ पियरे-एंटोनी यह ध्यान रखें कि Error.prototype.stack संपत्ति गैर-मानक है: / आपको इसका उपयोग देखभाल के साथ करना चाहिए। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
— अब्दुल्ला

3
@ अब्दुल्लाअय्यदन: ध्यान दें कि जब तक त्रुटि फेंकी नहीं जाती है तब तक IE और एज ब्राउज़र में एक नई त्रुटि की स्टैक प्रॉपर्टी पॉपुलेट नहीं की जाती है।
— बॉब अरलॉफ

15

यदि आपके पास jQuery का उपयोग करने का मौका है, तो कोड इस तरह दिखाई देगा:

$('script[src$="/myscript.js"]').attr('src');

यह defer, async और आलसी लोडिंग स्क्रिप्ट के साथ काम करता है?
— Stephan

यह सिर्फ src "/myscript.js" के साथ एक स्क्रिप्ट टैग के लिए DOM के माध्यम से देख रहा है। अन्य विशेषताओं से कोई फर्क नहीं पड़ेगा
— Rebs

किसी अन्य स्थान पर वर्डप्रेस के साथ इसका उपयोग करने के लिए, जो संस्करण को जोड़ता है, आपको $ ('स्क्रिप्ट [src * = "/ myscript.js"]') का उपयोग करना चाहिए।) Attr ('src'); इस तरह यह स्क्रिप्ट के अंत में? ver = 2.3.3 की अनदेखी करेगा। * यह अंत में क्या है की परवाह किए बिना काम करता रहेगा।
— मवि 2287

15

सरल और सीधा समाधान जो बहुत अच्छा काम करता है:

यदि यह IE नहीं document.currentScript
है document.querySelector('script[src*="myscript.js"]')
तो आप IE के लिए उपयोग कर सकते हैं आप ऐसा कर सकते हैं :

function getScriptURL(){
 var script =  document.currentScript || document.querySelector('script[src*="myscript.js"]')
 return script.src
}

2

निम्नलिखित कोड आपको दिए गए नाम के साथ स्क्रिप्ट तत्व खोजने देता है

var scripts = document.getElementsByTagName( 'script' );
        var len = scripts.length
        for(var i =0; i < len; i++) {
            if(scripts[i].src.search("<your JS file name") > 0 && scripts[i].src.lastIndexOf("/") >= 0) {
                absoluteAddr = scripts[i].src.substring(0, scripts[i].src.lastIndexOf("/") + 1);
                break;
            }
        }

-6

क्या आप location.href या location.host का उपयोग नहीं कर सकते हैं और फिर स्क्रिप्ट नाम को जोड़ सकते हैं?


1
यह काम नहीं करेगा, क्योंकि स्क्रिप्ट site1.com/index.html पेज के भीतर चल रही है । इसलिए, यहां तक ​​कि स्क्रिप्ट के माध्यम से साइट 2.com से लोड किया जाता है, यदि आप स्क्रिप्ट के भीतर से स्थान तक पहुंचते हैं, तो यह " site1.com/index.html " पर वापस आ जाएगा ...
— MikeC8
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.