关于dom:JavaScript:获取当前正在执行的< script>

JavaScript: get the current executing <script> node?

本问题已经有最佳答案,请猛点这里访问。

我需要知道是否可以获取当前的执行节点?

例子:

1
2
3
4
5
..html
<script id="x">
  console.log(document.currentNode.id); // << this must return"x"

..html

谢谢!


我不完全确定,但是由document.getElementsByTagName('script')返回的脚本标记集合不应该包括当前正在执行的下面的脚本标记。换言之,我认为这应该有效:

1
2
var arrScripts = document.getElementsByTagName('script');
var strScriptTagId = arrScripts[arrScripts.length - 1].id;

这只适用于在页面加载时执行的脚本。如果在延迟脚本中执行或作为页面加载事件的一部分执行,它可能总是报告完全呈现页面中的最后一个。请注意,id标记不是的有效属性,因此您的页面可能不会进行验证。如果您有任何编写脚本标记的外部脚本(例如,第三方广告),我认为代码将是不可预测的。几年前我就有过这个想法,但结果并不令人满意。


gecko(firefox)支持指向当前脚本节点的文档对象的非标准属性。在回答上述问题之前,您可能需要检查一下。

https://developer.mozilla.org/en-us/docs/dom/document.currentscript

1
2
<script id="x">
  console.log(document.currentScript.id); // << this must return"x"


安德鲁斯的回答已经是一个好主意,但我经历了所有提到的问题。这就是为什么我选择了一种不同的方法,它对IE、FF和Chrome很有效。

只需在映像的onload事件中执行脚本。定义一个透明的1pixelgif内联,当它触发时,您将收到"this"。

此示例用于在渲染时动态更改DIV内容。我的目标是用基于浏览器的XSL呈现(此处未显示)创建的不同innerHTML填充DIV。

当然,您甚至可以从Internet加载任何图像,因此它不能是内联的。最大的好处是:图像和它的事件正在用新的内容替换它们自己,所以即使图像也会消失。"div"甚至不需要任何"id"分配。

1
2
empty
    <img onLoad="changeNodeOnTheFly(this,'hurra');void(0);" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="/>

剧本:

1
2
3
4
function changeNodeOnTheFly(ele, text)
{
ele.parentNode.innerHTML=text;
}

溴海口


使用document.write查找您的位置:

1
2
3
4
5
6
7
8
9
10
<script data-foo="bar">
  var id = 'placeholder-' + Math.floor(Math.random() * 1e10)
  document.write('')

  var placeholder = document.getElementById(id)
  var script = placeholder.previousSibling
  placeholder.parentNode.removeChild(placeholder)

  //"bar" is written to the document
  document.write(script.getAttribute('data-foo'))

为什么不使用:

1
2
<script id="x">
  console.log(document.getElementById("x").id);