Ответ 1
OP имеет хорошее решение сложной проблемы. Тем не менее, здесь есть несколько незначительных предложений по его улучшению.
Функция должна использовать document.currentScript, когда она доступна. Он хорошо работает независимо от ситуации. Доступно в FireFox +4, Chrome +29 и Opera +16.
В IE 6-10 можно использовать script.readyState для эмуляции document.currentScript. Он также работает хорошо, независимо от ситуации.
Чтобы избежать проблем, функция должна выйти, когда document.readyState == "завершена" или даже на более раннем "интерактивном" этапе в зависимости от кода. document.currentScript перестает работать, когда "завершен". Однако document.write останавливается на "интерактивном", т.е. Метод записи меток для поиска скриптов будет терпеть неудачу с ленивым загруженным script.
Атрибут script async должен быть проверен перед использованием document.write(). Сценарии с пометкой async отделяются от документа, а метод document.write() не работает должным образом.
OP-код записывает <p> , но тег стиля, похоже, лучше работает со сценариями в теле и голове... и без побочных эффектов.
Идентификатор тега случайных чисел, похоже, не очень полезен, поскольку элемент удален. Может быть, лучше пойти с постоянной GUID, которая будет использоваться повторно.
UPDATE:
Я обновил свой пример кода ниже, чтобы проиллюстрировать способ сделать это без написания тегов. Кажется, он отлично работает с Chrome, FireFox, Opera и IE 5-10. Возвращает правильное значение независимо от введенных скриптов и атрибутов script (отложить и асинхронно). Трудная часть - что делать с IE +11? Microsoft удалила script.readyState в IE11 без предоставления альтернативы. Одним из способов является использование "MutationObserver" для поиска сценариев. В IE эти события происходят каждый раз перед выполнением script (в отличие от onload, который происходит после этого). И это хорошо работает, за исключением случаев, когда есть загруженные извне скрипты с установленными атрибутами отсрочки или асинхронизации. Асинхронные скрипты особенно сложны, потому что они могут выполняться в любое время и не всегда в одном порядке (мое наблюдение).
В любом случае, я думал, что отправлю этот код с надеждой, что он может дать отправную точку и помочь другим.
Литература:
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
http://msdn.microsoft.com/en-us/library/ie/dn265034 (v = vs .85).aspx
CODE SNIPPET:
var currentScript = (function() {
// PRIVATE
var observer, current, nodes;
// IE+11 - untested with other browsers.
if (!document.currentScript && typeof MutationObserver=='function') {
observer = new MutationObserver(function(mutations) {
if (document.readyState=='complete') observer.disconnect();
mutations.forEach(function(mutation) {
nodes = mutation.addedNodes;
if (nodes.length && nodes[0].nodeName=='SCRIPT') {
current = nodes[0];
}
});
});
observer.observe(window.document, {childList: true, subtree: true});
}
// PUBLIC
return function() {
if (document.readyState=='complete') return;
// CHROME+29, FIREFOX+4, OPERA+16
if (document.currentScript) return document.currentScript;
var i, s=document.getElementsByTagName('SCRIPT');
// MSIE+5-10
if (s[0].readyState)
for(i=0; i<s.length; i++)
if (s[i].readyState=='interactive') return s[i];
// IE+11
if (current) return current;
// BEST GUESS
return s[s.length-1];
}
})()