2010-06-02 81 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> 
相關問題