Каков мой URL script src?
Существует ли простой и надежный способ определения URL-адреса исполняемого файла JavaScript (внутри веб-страницы)?
Моя единственная мысль в этом заключается в том, чтобы отсканировать DOM для всех атрибутов script src
, чтобы найти способ ссылки на текущий файл, а затем определить абсолютный URL-адрес, применив его к document.location
. У кого-нибудь есть другие идеи, есть ли какой-то сверхлегкий метод, который я полностью игнорировал?
UPDATE: script элементы, доступные через DOM, уже имеют свойство src
, которое содержит полный URL-адрес. Я не знаю, как вездесущий/стандартный, но в качестве альтернативы вы можете использовать getAttribute("src")
, который будет возвращать любое значение исходного атрибута в HTML файле [X].
Ответы
Ответ 1
Поместите это в файл 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).
Ответ 2
Для последних браузеров вы можете использовать document.currentScript для получения этой информации.
var mySource = document.currentScript.src;
Поверхность заключается в том, что она более надежна для сценариев, которые загружаются асинхронно. Недостатком является то, что он, насколько мне известно, не поддерживается повсеместно. Он должен работать на Chrome >= 29, FireFox >= 4, Opera >= 16. Как и многие полезные вещи, он не работает в IE.
Когда мне нужно получить путь script, я проверяю, установлен ли 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
Ответ 3
Как показано в источнике (например, /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
Ответ 4
Этот метод работает с отсрочкой, асинхронной и ленивой загрузкой
Поскольку вы знаете имя файла вашего script, и если оно будет уникальным
/* 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
note: это не будет работать с локальным script, загруженным jQuery.getScript(), поскольку в dom не добавлен тег script. script оценивается только в глобальном пространстве.
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);
}
}
});
}
Ответ 5
Если это строго клиентское решение, ваш звук звучит неплохо.
Если вы пишете код на сервере, вы, вероятно, можете просто заполнить div/hidden field/(вставьте свой HTML-элемент) здесь с полностью разрешенным URL-адресом в script и выберите это с помощью javascript на клиентов.
Ответ 6
Вы можете посмотреть 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)
Однако почему это важно? Если script вызывает ошибки, то достаточно просто определить, где происходит ошибка. Если это вообще не об ошибках, то какое преимущество в знании, из какого файла он исходит?