Как я могу найти элемент 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 используется для заполнителя.