JavaScript:如何获取当前正在执行的<script>节点?

30
我需要知道是否有可能获取当前执行的节点?
例子:
..html
<script id="x">
  console.log(document.currentNode.id); // << this must return "x"
</script>
..html

感谢!


我正在尝试替换document.write,以延迟广告加载... - Martin Borthiry
5个回答

25

8
document.currentScript 实际上是 HTML5 的一部分:http://www.whatwg.org/specs/web-apps/current-work/multipage/dom.html#dom-document-currentscript。 - scribu
2
Chrome也支持它(自v.29起)。 - Konstantin Smolyanin
目前而言,这是最好的答案。 - Timo Huovinen

22

我不能够百分之百地确定,但是使用document.getElementsByTagName('script')返回的 script 标签集合不应包括当前执行的<script>标签下面的脚本标签。换句话说,我认为这样做应该可行:

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

这只对正在页面加载时执行的脚本有效。如果这个脚本是作为延迟脚本或页面加载事件的一部分执行,那么它很可能始终报告完全呈现页面中最后一个 <script>。请注意,id标签不是 <script> 的有效属性,因此你的页面可能无法验证。如果你有任何编写脚本标记的外部脚本(例如第三方广告),我认为代码将是不可预测的。我在几年前尝试了这个想法,结果并不令人满意。


5
异步脚本无法使用此方法。 - unscriptable
6
@unscriptable,是的。我认为我在我的回答中已经非常清楚地解释了这一点。不是吗? - Andrew

3

安德鲁的回答已经是一个好主意,但我遇到了所有提到的问题。这就是为什么我选择了一种不同的方法,在IE、FF和Chrome中都能很好地工作。

只需在图像的onload事件中执行脚本。内联定义一个透明的1像素gif,当其触发时,将接收"this"。

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

当然,您甚至可以从互联网加载任何图像,因此它不必是内联的。而且巨大的好处是,图像及其事件会用新内容替换自己,因此即使图像消失了,"div"也不需要任何"id"分配。

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

脚本:

该脚本:

<script>
function changeNodeOnTheFly(ele, text)
{
ele.parentNode.innerHTML=text;
}
</script>

BR Heiko


非常酷且更安全的方式来解决这个问题,太棒了! - Alex

2

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

<script data-foo="bar">
  var id = 'placeholder-' + Math.floor(Math.random() * 1e10)
  document.write('<div id=' + id + '></div>')

  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'))
</script>

1
为什么不使用:

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

1
因为您一开始没有ID名称 - 这是注入的DOM内容中非常特定的问题。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接