Вопрос

Есть ли простой и надежный способ определить 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.currentScript для получения этой информации.

var mySource = document.currentScript.src;

Положительным моментом является то, что он более надежен для сценариев, загружаемых асинхронно.Обратной стороной является то, что, насколько мне известно, он не поддерживается повсеместно.Он должен работать в Chrome >= 29, FireFox >= 4, Opera >= 16.Как и многие полезные вещи, он не работает в IE.

Когда мне нужно получить путь к скрипту, я проверяю, определен ли 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

Как это указано в исходнике (например. /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):

После некоторых тестов кажется трудным получить Полностью квалифицированный один в кроссбраузерном режиме.А решение, предложенное Crescent Fresh не работает в IE8, чтобы получить полностью квалифицированный, даже если это работает в IE7

Этот метод работает с Defer, Async и Lazy Doalling, так как вы знаете имя файла вашего сценария, и если оно будет уникальным

/* 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(), поскольку в 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/скрытое поле/(вставьте сюда свой любимый HTML-элемент) полностью разрешенным URL-адресом сценария и использовать его с помощью своего javascript на стороне клиента.

Возможно, вы захотите взглянуть на https://addons.mozilla.org/en-US/firefox/addon/10345 если вам интересно узнать, какие функции (и, следовательно, какой файл) выполняются на странице, которую вы не контролируете.

Если вам интересно выяснить, какой из твой скрипты выполняются, то есть несколько способов.С Firebug вы можете console.log() информация.Даже простое добавление операторов предупреждений в ваш код (хоть и раздражает) может помочь в отладке с использованием простых технологий.Вы также можете вызвать ошибки и перехватить их, а затем обработать, используя свойства ошибки (см.: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error)

Однако почему это может быть важно?Если сценарий уже вызывает ошибки, достаточно легко определить, где возникает ошибка.Если дело вообще не в ошибках, то какая польза знать какие файл оно произошло от?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top