Как я могу сослаться на тег script, который загрузил выполняемый в данный момент скрипт? - PullRequest
257 голосов
/ 31 декабря 2008

Как я могу сослаться на элемент скрипта, который загрузил JavaScript, который в данный момент работает?

Вот ситуация. У меня есть «главный» скрипт, загружаемый высоко на странице, в первую очередь под тегом HEAD.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="scripts.js"></script>

В "scripts.js" есть скрипт, который должен уметь загружать другие скрипты по требованию. Обычный метод не совсем подходит для меня, потому что мне нужно добавить новые сценарии без ссылки на тег HEAD, потому что элемент HEAD не закончил рендеринг:

document.getElementsByTagName('head')[0].appendChild(v);

Что я хочу сделать, так это сослаться на элемент script, который загрузил текущий скрипт, чтобы я мог после этого добавить свои новые динамически загружаемые теги script в DOM.

<script type="text/javascript" src="scripts.js"></script>
loaded by scripts.js--><script type="text/javascript" src="new_script1.js"></script>
loaded by scripts.js --><script type="text/javascript" src="new_script2.js"></script>

Ответы [ 13 ]

0 голосов
/ 20 августа 2018

Я нашел следующий код наиболее последовательным, производительным и простым.

var scripts = document.getElementsByTagName('script');
var thisScript = null;
var i = scripts.length;
while (i--) {
  if (scripts[i].src && (scripts[i].src.indexOf('yourscript.js') !== -1)) {
    thisScript = scripts[i];
    break;
  }
}
console.log(thisScript);
0 голосов
/ 11 ноября 2009

Если вы можете принять имя файла скрипта, вы можете найти его. Пока что я действительно протестировал только следующую функцию в Firefox.

  function findMe(tag, attr, file) {
    var tags = document.getElementsByTagName(tag);
    var r = new RegExp(file + '$');
    for (var i = 0;i < tags.length;i++) {
      if (r.exec(tags[i][attr])) {
        return tags[i][attr];
      }
    }
  };
  var element = findMe('script', 'src', 'scripts.js');
0 голосов
/ 01 января 2009

У меня есть это, которое работает в FF3, IE6 и 7. Методы в загружаемых скриптах по требованию недоступны, пока загрузка страницы не завершится, но это все еще очень полезно.

//handle on-demand loading of javascripts
makescript = function(url){
    var v = document.createElement('script');
    v.src=url;
    v.type='text/javascript';

    //insertAfter. Get last <script> tag in DOM
    d=document.getElementsByTagName('script')[(document.getElementsByTagName('script').length-1)];
    d.parentNode.insertBefore( v, d.nextSibling );
}
...