Javascript 如何引用加载当前正在执行的脚本的脚本标记?

Javascript 如何引用加载当前正在执行的脚本的脚本标记?,javascript,element,parent,Javascript,Element,Parent,如何引用加载当前正在运行的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:la

如何引用加载当前正在运行的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>
我想做的是引用加载当前脚本的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>

由scripts.js加载-->
由scripts.js加载-->

最简单的方法可能是给你的scrip标签一个
id
属性。

最简单的方法可能是给你的scrip标签一个
id
属性。

我有这个,它在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 );
}
//处理Java脚本的按需加载
makescript=函数(url){
var v=document.createElement('script');
v、 src=url;
v、 type='text/javascript';
//insertAfter.Get DOM中的最后一个标记
d=document.getElementsByTagName('script')[(document.getElementsByTagName('script').length-1)];
d、 parentNode.insertBefore(v,d.nextSibling);
}

我有这个,它在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 );
}
//处理Java脚本的按需加载
makescript=函数(url){
var v=document.createElement('script');
v、 src=url;
v、 type='text/javascript';
//insertAfter.Get DOM中的最后一个标记
d=document.getElementsByTagName('script')[(document.getElementsByTagName('script').length-1)];
d、 parentNode.insertBefore(v,d.nextSibling);
}

如果可以假定脚本的文件名,就可以找到它。到目前为止,我只在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');
函数findMe(标记、属性、文件){
var tags=document.getElementsByTagName(标记);
var r=newregexp(文件+'$);
对于(var i=0;i
如果可以假定脚本的文件名,就可以找到它。到目前为止,我只在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');
函数findMe(标记、属性、文件){
var tags=document.getElementsByTagName(标记);
var r=newregexp(文件+'$);
对于(var i=0;i
由于脚本是按顺序执行的,因此当前执行的脚本标记始终是页面上的最后一个脚本标记,直到那时。因此,要获取脚本标记,可以执行以下操作:

var scripts = document.getElementsByTagName( 'script' );
var thisScriptTag = scripts[ scripts.length - 1 ];

由于脚本是按顺序执行的,因此当前执行的脚本标记始终是页面上的最后一个脚本标记,直到那时。因此,要获取脚本标记,可以执行以下操作:

var scripts = document.getElementsByTagName( 'script' );
var thisScriptTag = scripts[ scripts.length - 1 ];

只有当脚本没有“延迟”或“异步”属性时,才会按顺序执行脚本。了解脚本标记的一个可能的ID/SRC/TITLE属性在这些情况下也可以起作用。所以格雷格和贾斯汀的建议都是正确的

WHATWG列表上已经有一个关于
文档.currentScript
的提案

编辑:Firefox>4已经实现了这个非常有用的属性,但它在我上次检查的IE11中不可用,仅在Chrome 29和Safari 8中可用

编辑:没有人提到“document.scripts”集合,但我相信以下内容可能是获取当前正在运行的脚本的一个很好的跨浏览器替代方案:

var me = document.scripts[document.scripts.length -1];

只有当脚本没有“延迟”或“异步”属性时,才会按顺序执行脚本。了解脚本标记的一个可能的ID/SRC/TITLE属性在这些情况下也可以起作用。所以格雷格和贾斯汀的建议都是正确的

WHATWG列表上已经有一个关于
文档.currentScript
的提案

编辑:Firefox>4已经实现了这个非常有用的属性,但它在我上次检查的IE11中不可用,仅在Chrome 29和Safari 8中可用

编辑:没有人提到“document.scripts”集合,但我相信以下内容可能是获取当前正在运行的脚本的一个很好的跨浏览器替代方案:

var me = document.scripts[document.scripts.length -1];

它必须在页面加载和使用javascript添加脚本标记时工作(例如,使用ajax)


var$this=document.getElementById(“currentScript”);
$this.setAttribute(“id”,”);
//...

它必须在页面加载和使用javascript添加脚本标记时工作(例如使用ajax)


var$this=document.getElementById(“currentScript”);
$this.setAttribute(“id”,”);
//...

按照以下简单步骤获取对当前正在执行的脚本块的引用:

  • 在脚本块中放置一些随机唯一字符串(每个脚本块中必须唯一/不同)
  • 迭代document.getElementsByTagName(“脚本”)的结果,从每个内容(从innerText/textContent属性获得)中查找唯一的字符串
  • 示例(ABCDE345678是唯一的ID):


    按照以下简单步骤获取对当前执行脚本块的引用:

  • 在脚本块中放置一些随机唯一字符串(每个脚本块中必须唯一/不同)
  • 迭代document.getElementsByTagName(“脚本”)的结果,从每个内容(从innerText/textContent属性获得)中查找唯一的字符串
  • 示例(ABCDE345678是唯一的ID):


    处理异步和延迟脚本的一种方法是利用onload处理程序-为所有脚本标记设置onload处理程序,第一个执行的应该是您的

    function getCurrentScript(callback) {
      if (document.currentScript) {
        callback(document.currentScript);
        return;
      }
      var scripts = document.scripts;
      function onLoad() {
        for (var i = 0; i < scripts.length; ++i) {
          scripts[i].removeEventListener('load', onLoad, false);
        }
        callback(event.target);
      }
      for (var i = 0; i < scripts.length; ++i) {
        scripts[i].addEventListener('load', onLoad, false);
      }
    }
    
    getCurrentScript(function(currentScript) {
      window.console.log(currentScript.src);
    });
    
    函数getCurrentScript(callba
    HEAD
      SCRIPT script.js
      SCRIPT inserted.js
      SCRIPT otherscript.js
    BODY
    
    function getCurrentScript(callback) {
      if (document.currentScript) {
        callback(document.currentScript);
        return;
      }
      var scripts = document.scripts;
      function onLoad() {
        for (var i = 0; i < scripts.length; ++i) {
          scripts[i].removeEventListener('load', onLoad, false);
        }
        callback(event.target);
      }
      for (var i = 0; i < scripts.length; ++i) {
        scripts[i].addEventListener('load', onLoad, false);
      }
    }
    
    getCurrentScript(function(currentScript) {
      window.console.log(currentScript.src);
    });
    
    <script id="uniqueScriptId">
        (function () {
            var thisScript = document.CurrentScript || document.getElementByID('uniqueScriptId');
    
            // your code referencing thisScript here
        ());
    </script>
    
    <script>
    var me = document.currentScript;
    </script>
    
    <script id="myscript">
    var me = document.getElementById('myscript');
    </script>
    
    <script data-name="myscript">
    var me = document.querySelector('script[data-name="myscript"]');
    </script>
    
    <script src="//example.com/embed.js"></script>
    
    var me = document.querySelector('script[src="//example.com/embed.js"]');
    
    <script>
    var me = null;
    var scripts = document.getElementsByTagName("script")
    for (var i = 0; i < scripts.length; ++i) {
        if( isMe(scripts[i])){
          me = scripts[i];
        }
    }
    </script>
    
    function isMe(scriptElem){
        return scriptElem.getAttribute('src') === "//example.com/embed.js";
    }
    
    <script>
    var scripts = document.getElementsByTagName( 'script' );
    var me = scripts[ scripts.length - 1 ];
    </script>
    
    (function () {
      var scripts = document.scripts;
    
      // Scan for this data-* attribute
      var dataAttr = 'data-your-attribute-here';
    
      var i = 0;
      var script;
      while (i < scripts.length) {
        script = scripts[i];
        if (/your_script_here\.js/i.test(script.src)
            && !script.hasAttribute(dataAttr)) {
    
            // A good match will break the loop before
            // script is set to null.
            break;
        }
    
        // If we exit the loop through a while condition failure,
        // a check for null will reveal there are no matches.
        script = null;
        ++i;
      }
    
      /**
       * This specific your_script_here.js script tag.
       * @type {Element|Node}
       */
      var yourScriptVariable = null;
    
      // Mark the script an pass it on.
      if (script) {
        script.setAttribute(dataAttr, '');
        yourScriptVariable = script;
      }
    })();
    
    var thisScript = document.currentScript;
    
    var url = thisScript.src
    
    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);