2010-11-02 42 views
0

我有一個JS腳本,它創建了一個新節點並將其插入HTML頁面。我正在處理DOM突變事件,並可以捕獲DOMNodeInserted事件。在函數內部,我想找出源(即HTML的哪個部分具有腳本函數被調用)和目標(即在HTML頁面中將節點添加到哪個部分)。如何找到啓動JavaScript事件的位置?

我能找到目標使用event.target,但我無法找到事件的來源。

例如,請考慮下面的僞代碼的HTML頁面:

<html> 
<head> 
<script> 
    function test() { 
     //DOM access 
     <div_object>.setAttribute("attr", "value"); 
    } 
</script> 
</head> 
<body onload="test()"> 
    <div id="123"> 
    </div> 
</body> 
</html> 

我想我的源爲身體(因爲這是被腳本啓動),目標應的div(123)(因爲屬性被添加到div_123。

我怎樣才能做到這一點?

回答

0

對不起,你不能找出什麼原因引起的一段代碼到被觸發的事件,他們完全脫鉤。您必須通過將其自己的this/event.target的值存儲在變量中才能使觸發代碼進行合作,以便稍後獲取觸發代碼。

但是,如果你有這樣的合作,你不需要DOM突變事件。

如果您有一個事件處理層(作爲許多JS框架的一部分),您可以在該層中放置跟蹤代碼,以便觸發代碼可以詢問「在我之前發生的最後一個事件是什麼?」。

但我不相信這是值得的。通常最好添加你自己的合作鉤子,在組件之間進行通信;一般不能依賴DOM突變事件,因爲它們不是全局的,也不是完全支持的(或者完全支持IE < 9)。

0

什麼

<html> 
<head> 
<script> 
    function test(element) { 
     //DOM access 
     element.setAttribute("attr", "value"); 
    } 
</script> 
</head> 
<body onload="test(this)"> 
    <div id="123"> 
    </div> 
</body> 
</html> 

+0

你的意思是功能測試(元素){警報(element.tagName); ....他想在div – mplungjan 2010-11-02 07:33:32

0

有趣。我一看這裏(回答讓格式化)

<html> 
<head> 
<script> 
function test(e) { 
    if (e) var event=e; 
//DOM access 
    var t=""; 
    for (o in event) t+='<br/>'+o+':'+event[o] 
    document.getElementById('d123').innerHTML=t; 
} 
</script> 
</head> 
<body onload="test(event)"> 
    <div id="d123"> 
    </div> 
</body> 
</html> 
+0

上設置屬性感謝您的回覆。我不允許修改源JS,即我不允許修改「test()」函數調用。您的解決方案是修改該呼叫。 – Praveen 2010-11-03 06:30:20

+0

Morevoer,我必須在突變事件處理程序中找到DOM訪問的來源,而不是在test()函數中。當發生setAttribute時,它會觸發DOMAttrModified事件。我應該處理這個問題,並找到事件的來源,這是「身體」。如果需要進一步澄清,請隨時詢問。 – Praveen 2010-11-03 06:32:16