سؤال

هل هناك طريقة بسيطة وموثوقة لتحديد عنوان URL لملف JavaScript المنفذ حاليا (داخل صفحة ويب)؟

فكرتي الوحيدة في هذا هو مسح DOM لجميع البرنامج النصي src سمات للعثور على كيفية الرجوع إلى الملف الحالي ثم معرفة عنوان URL المطلق عن طريق تطبيقه على document.location. وبعد أي شخص لديه أفكار أخرى، هل هناك طريقة سهلة للغاية يتم تجاهلها بالكامل؟

تحديث: عناصر البرنامج النصي الوصول إليها عبر DOM لديك بالفعل src الممتلكات التي تحتوي على عنوان URL الكامل. لا أعرف كيف هي في كل مكان / قياسي، ولكن بدلا من ذلك، يمكنك استخدامها getAttribute("src") مما سيعود أي قيمة السمة الخام موجودة في [X] HTML.

هل كانت مفيدة؟

المحلول

ضع هذا في ملف JS الذي يحتاج إلى معرفة عنوان URL الخاص به.

مؤهل تماما (على سبيل المثال 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)
}());

يرى http://www.glennjones.net/post/809/getattributehrefbug.htm. لتفسير getAttribute المعلمة قيد الاستخدام (إنه علة IE).

نصائح أخرى

للمتصفحات الأخيرة، يمكنك استخدام Document.currentcript للحصول على هذه المعلومات.

var mySource = document.currentScript.src;

الاتجاه الصعودي هو أنه أكثر موثوقية للنصوص التي يتم تحميلها بشكل غير متزامن. الجانب السلبي هو أنه ليس كذلك، كما أعرف، بدعم عالميا. يجب أن تعمل على Chrome> = 29، Firefox> = 4، Opera> = 16. مثل العديد من الأشياء المفيدة، لا يبدو أنها تعمل في IE.

عندما أحتاج إلى الحصول على مسار نصي، أتحقق من معرفة ما إذا تم تعريف المستند. تم تعريف الدقة. وإذا لم يكن كذلك، استخدم الطريقة الموضحة في الإجابة المقبولة.

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

https:/developer.mozilla.org/en-us/docs/web/api/document.currentcript.

كما يظهر في المصدر (على سبيل المثال /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):

بعد بعض الاختبارات يبدو من الصعب الحصول على مؤهل تماما واحد في طريقة المتصفح عبر. ال الحل الذي اقترحه الهلال الطازج لا يعمل في IE8 للحصول على مؤهل بالكامل, حتى لو كان يعمل في IE7

تعمل هذه الطريقة مع تأجيل، Async و Lazy Loading منذ أن تعرف اسم ملف السيناريو الخاص بك، وإذا كان الأمر فريدا

/* 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('/'))+"/";

قالب مسج مسج معه:https://github.com/mkdgs/mkdgs-snippet/blob/master/javascript/jquery.plugins.template.js.

ملاحظة: لن يعمل هذا مع البرنامج النصي المحلي الذي تم تحميله بواسطة JQuery.getScript ()، لأنه لا توجد علامة نصية تمت إضافتها إلى DOM. يتم تقييم البرنامج النصي فقط في الفضاء العالمي.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);
                }
          }
     });
}

إذا كان هذا هو الحل العميل الصارم، فإنك تبدو جيدة.

إذا كنت تكتب رمز على الخادم، فمن المحتمل أن تكون مجرد ملء حقل DIV / HIDDEN / (أدخل عنصر HTML FAVE الخاص بك هنا) مع عنوان URL المحدد بالكامل إلى البرنامج النصي، واختيار ذلك مع JavaScript الخاص بك على Clientside.

قد ترغب في إلقاء نظرة على https://addons.mozilla.org/en-us/firefox/addon/10345. إذا كنت مهتما بتعلم الوظائف (وبالتالي أي ملف) تنفيذها على صفحة لا تتحكم فيها.

إذا كنت مهتما في معرفة أي من لك يتم تنفيذ البرامج النصية، ثم هناك عدد من الطرق. مع firebug هل يمكن console.log() المعلومات. حتى مجرد وضع بيانات التنبيه في التعليمات البرمجية الخاصة بك (أثناء الإزعاج) يمكن أن يساعد في تصحيح الطريق في طريقة منخفضة التكنولوجيا. يمكنك أيضا رفع أخطاء وقم بالقبض عليها، ثم عملية استخدام خصائص الخطأ (انظر: https:/developer.mozilla.org/en/core_javascript_1.5_reence/global_objects/error.)

ومع ذلك، لماذا سيكون هذا مهم؟ إذا كان البرنامج النصي يسبب أخطاء بالفعل، فمن السهل بما يكفي لتحديد المكان الذي يحدث فيه الخطأ. إذا لم يكن الأمر يتعلق بالأخطاء على الإطلاق، فما هي الميزة في معرفة أي ملف انها تاتي من؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top