2010-06-02 109 views
22

我需要知道是否有可能获得当前的执行节点?JavaScript:获取当前正在执行的<script>节点?

例子:

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

谢谢!

+1

你会用什么这是为了? – 2010-06-02 03:25:29

+0

我试图替换document.write,以推迟加载的广告... – 2010-06-02 03:36:21

回答

20

我不知道100%确定,但document.getElementsByTagName('script')返回的脚本标记集合不应包含当前正在执行的脚本标记<script>。换句话说,我认为这应该工作:

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

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

+4

这不适用于异步脚本。 – unscriptable 2013-12-18 16:46:34

+6

@unscriptable,是的。我想我在我的回答中很清楚地解释了这一点。没有? – Andrew 2013-12-19 18:58:56

16

Gecko(Firefox)支持指向当前脚本节点的文档对象上的非标准属性。你可能想在查看上面的答案之前检查一下。

https://developer.mozilla.org/en-US/docs/DOM/document.currentScript

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

'document.currentScript'实际上是HTML5的一部分:http://www.whatwg.org/specs/web-apps/current-work/multipage/dom.html#dom-document-currentscript – scribu 2013-07-29 18:20:28

+2

Chrome也支持它(自v.29) – 2013-10-21 22:25:41

+0

截至目前,这是最好的答案 – 2014-10-02 09:27:25

0

为什么不使用:

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

因为您没有ID名称开头 - 这是与注入的DOM内容相当具体的问题 – Alex 2014-10-03 09:14:01

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 海科

+0

非常酷和更安全的方式来解决这个问题,伟大! – Alex 2014-10-03 09:15:13

2

使用文件撰写找到您的位置:

<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>