2009-06-12 2 views
31

Есть ли простой и надежный способ определения URL-адреса исполняемого файла JavaScript (внутри веб-страницы)?Что такое URL-адрес скрипта src?

Моя единственная мысль в этом заключается в том, чтобы отсканировать DOM для всех атрибутов скрипта src, чтобы найти способ ссылки на текущий файл, а затем выяснить абсолютный URL-адрес, применив его к document.location. У кого-нибудь есть другие идеи, есть ли какой-то сверхлегкий метод, который я полностью игнорировал?

UPDATE: Элементы сценария, доступные через DOM, уже имеют свойство src, которое содержит полный URL. Я не знаю, насколько вездесущим/стандартным является, но в качестве альтернативы вы можете использовать getAttribute("src"), который будет возвращать все необработанные значения атрибута в [X] HTML.

+0

возможно дубликат [Как я мог бы получить имя файла сценария внутри этого сценария?] (Http://stackoverflow.com/questions/710957/how-might-i-get-the -script-filename-from-in-that-script) – Bergi

ответ

40

Поместите это в файл js, который должен знать собственный URL.

Fully Qualified (например 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).

+0

Flipping GREAT! Благодаря! –

+1

Для полноценного использования вы не можете просто использовать script.src? Почему вы используете script.getAttribute ('src', -1) ??? –

+9

Отличный ответ. Одно предостережение - это сценарий, ленивый загруженный (введенный в DOM другим скриптом), это не будет последним сценарием в DOM, поэтому этот точный фрагмент не будет работать. – ripper234

0

Если это строго клиентское решение, ваше звучание звучит неплохо.

Если вы пишете код на сервере, возможно, вы просто можете заполнить div/hidden field/(вставьте свой HTML-элемент fave здесь) с полностью разрешенным URL-адресом для скрипта и выберите его с помощью javascript на сторона клиента.

+0

сервер, он может просто обслуживать js-файл asp/php/jsp/cgi и выводить URL-адрес в javascript оттуда. – ZJR

+0

@ZJR - В настоящее время я наслаждаюсь идеей «JS-корыта», однако он обслуживается;) – simon

0

Возможно, вы захотите взглянуть на 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)

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

+0

В моем текущем проекте файлы ресурсов JavaScript привязаны к определенному подкаталогу. Выяснив абсолютный URL сценария, вы можете сказать мне, что такое локальный базовый каталог, поэтому я могу отключить его, чтобы найти документ «ключ» (как известно на стороне сервера). Он будет использоваться для создания форм, асинхронных запросов и т. Д., А не для отладки. –

+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

Этот метод работы с DEFER, асинхронной и отложенной загрузки Поскольку вы знаете имя вашего сценария, и если это будет уникальный

/* 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); 
       } 
      } 
    }); 
} 
+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; 

Поверхность заключается в том, что она более надежна для сценариев, загружаемых асинхронно. Недостатком является то, что это не так, насколько мне известно, универсально поддерживается. Он должен работать на 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

+0

http://caniuse.com еще не контролирует эту функцию. Вы можете помочь с повышением: http://github.com/Fyrd/caniuse/issues/1099. – Stephan

Смежные вопросы