Получение URL-адреса исполняемого файла JavaScript (в основном проблема IE6-7)

Привет всем, я пытался собрать общую функцию, которая извлекает абсолютный URL-адрес исполняемого файла JavaScript на веб-странице:

http://gist.github.com/433486

В основном вы можете вызвать что-то вроде этого:

getScriptName(function(url) {
    console.log(url);
    // http://www.example.com/myExternalJsFile.js
});

внутри внешнего файла JavaScript на странице, а затем может что-то с ним сделать (например, найти тег <script>, который его загрузил).

Он отлично работает почти во всех браузерах, которые я тестировал (Firefox, Chrome, Safari, Opera v10, по крайней мере, и IE 8).

Однако в IE 6 и 7, похоже, это не удается. Функция обратного вызова выполняется, но полученное имя является URL-адресом главной HTML-страницы, а не файла JavaScript. Продолжая пример, getScriptName вызывает обратный вызов с параметром: http://www.example.com/index.html

Итак, все, что я действительно спрашиваю, это есть ли какой-то другой способ получить URL-адрес текущего файла JavaScript (который может быть специфичным для IE 6 и 7 хакерством)? Заранее спасибо!

EDIT: Кроме того, это не будет работать в каждом случае, поэтому, пожалуйста, не рекомендуйте это:

var scripts = document.getElementsByTagName("script");
return scripts[scripts.length-1].src;

Я бы хотел, чтобы это работало в случае динамически создаваемых тегов сценария (возможно, не размещаемых последними на странице), иначе называемых ленивой загрузкой.


person TooTallNate    schedule 10.06.2010    source источник
comment
Хороший код и вопрос. Хотя я не знаю ответа на этот вопрос, я просто хочу дать вам несколько оптимизаций: вы можете заменить каждое obj['prop'] на obj.prop, а поскольку typeof всегда возвращает строку, вам не нужно проверять подлинность (===); проверка на равенство (==) достаточно хороша. Они работают немного лучше, чем вещи в вашем коде.   -  person Marcel Korpel    schedule 11.06.2010
comment
Спасибо. Да, я знаю, что могу заменить obj['prop'] на obj.prop, у меня так было при подготовке к отправке функции в Google Closure Compiler, которая исказила бы эти имена переменных. Я заменю === на ==, спасибо!   -  person TooTallNate    schedule 11.06.2010
comment
Я только что проверил доступ к obj['prop'] по сравнению с obj.prop, но вопреки тому, что я думал, в Firefox разница была незначительной, тогда как в Chrome первый был на самом деле быстрее, чем последний. Я очень удивлен этим, возможно, это как-то связано с «компиляцией» JavaScript в V8.   -  person Marcel Korpel    schedule 12.06.2010
comment
Может быть, это мой недостаток, но какой в ​​этом смысл? Если бы вы знали, куда встроить скрипт в свой html, вы бы знали, откуда вы его вызываете...   -  person John    schedule 14.07.2010
comment
Я согласен с Джоном. Давайте взглянем на общую картину и выясним, почему вам нужны имена файлов сценариев. Это звучит как хрупкое программирование для меня.   -  person BoffinBrain    schedule 03.06.2011
comment
Стоит отметить, что даже если вы заработаете, код Javascript можно загрузить на страницу, используя методы Ajax. Код, загруженный таким образом, может не иметь обратной связи с исходным файлом, из которого он был получен. Кроме того, код может быть запущен через eval() или аналогичный, что будет иметь тот же эффект, даже если код исходил из обычного <script> включения.   -  person Spudley    schedule 03.07.2011
comment
Как кто-то может получить имя файла-скрипта, когда ie(6-7) сам не может обработать его без каких-либо исключений... когда возникает ошибка в любом файле, в любом месте, где сам ie указывает на страницу с номером строки, который я не понимаю, как вычисляется, может быть: номер строки-ошибки + 10/2 + журнал (длина сценария)   -  person Beygi    schedule 04.07.2011


Ответы (2)


Многое зависит от того, к чему у вас есть доступ. Если, как кажется, вы пытаетесь сделать это полностью в коде JS, я не верю, что вы сможете это сделать по некоторым причинам, показанным выше. Вы могли бы получить 90% пути, может быть, но не быть окончательным.

Если вы работаете в среде dotnet (а это единственное, что я знаю), я бы предложил использовать модуль, который бы перехватывал все запросы JS и добавлял в них местоположение запроса или что-то в этом роде.

Я думаю, вам нужно решать это со стороны сервера, а не со стороны клиента. Я не думаю, что у вас будет окончательный ответ со стороны клиента. Я думаю, вам также будет сложно получить ответ со стороны сервера, но вы можете добиться большего успеха.

person Schroedingers Cat    schedule 04.07.2011

Извините, я подозреваю, что вы можете бороться с этим. IE до версии 8 обычно выдает сообщения об ошибках javascript в форме:

line: 342
char: 3
error: expected identifier, string or number
code: 0
url: http://example.com/path/to/resource

где URL-адрес — это window.location.href, а не URL-адрес внешнего ресурса Javascript, который содержит проблему. Я предлагаю, чтобы IE предоставил бесполезное значение URL-адреса, поскольку URL-адрес сценария недоступен для IE в этот момент, и он также недоступен для любого Javascript, который вы можете написать, чтобы попытаться отобразить его.

Я хотел бы иметь возможность ссылаться на примечания к выпуску IE8, в которых говорится, что эта ошибка / функция была исправлена, поэтому я создал это как вики сообщества. Мой MSDN foo довольно слаб!

person Community    schedule 04.07.2011