Как я могу найти элемент script, связанный с текущим запуском script? Меня интересуют только скрипты внутри тела документа, а не в голове (или в другом месте).
Вот что я до сих пор, похоже, все в порядке. Есть ли возможные подводные камни, о которых я не думаю?
function getCurrentScriptElement() {
var placeholderId = 'placeholder-' + Math.random(),
script, placeholder;
document.write('<br id="' + placeholderId + '">');
placeholder = document.getElementById(placeholderId);
script = placeholder.previousSibling;
placeholder.parentNode.removeChild(placeholder);
return script;
}
В этом случае я имею в виду сценарии, которые должны вводить контент в том же месте в документе, где встречается тег script, поэтому отложенная загрузка не будет проблемой. Другими словами, я буду называть эту функцию только в тех местах, где она подходит, она не будет отображаться как часть API или что-то еще.
Я также знаю проблему с document.write
и XHTML, и я не беспокоюсь об этом в этом случае (пока).
Моя предыдущая попытка выглядела примерно так:
function getCurrentScriptElement() {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length - 1];
}
Но, как мы видим в этом вопросе, это может легко потерпеть неудачу, если в документ был добавлен другой script.
Я также нашел document.currentScript
в этом WHATWG spec. На данный момент это, похоже, не поддерживается широко. Там интересная прокладка для document.currentScript
, которая принимает другой маршрут... script вызывает ошибку, ловит ее, проверяет трассировку стека чтобы найти URL-адрес script, а затем найдет элемент script с соответствующим атрибутом src
.
Это умное решение, но оно, по-видимому, не будет работать в IE, и оно сломается, если несколько скриптов используют одинаковые URL-адреса.
В идеале я хотел бы найти решение, которое дает тот же результат, что и образец верхнего кода (без дополнительных требований), но не полагается на document.write
. Это возможно? Если нет, является ли этот код достаточно безопасным, если он используется правильно (только во время загрузки страницы, а не XHTML)?
Изменить: см. этот ответ для другого потенциального варианта использования и подробную информацию о том, почему элемент br
используется для заполнителя.