2012-08-06 52 views
65

你好,我是一個新的程序員,仍然在學習。 這是我試圖找出代碼:如何查看附加到html元素的事件?

<div id="buy" class="buy button">Buy</div> 

當我點擊股利(按鈕),執行一些JavaScript代碼,但我不知道是它。如何知道點擊發生時觸發了哪些功能?一個偵聽器的一些如何連接到這個元素

+0

事件處理程序在哪裏? – 2012-08-06 17:05:36

+0

你問*如何*事件處理程序連接到div? – Blazemonger 2012-08-06 17:06:29

+2

備註:您不應該使用div作爲按鈕,而應使用Im a link。 – 2012-08-06 17:06:55

回答

23

如果您使用Firefox和Firebug,您可以嘗試安裝FireQuery。它會讓你可以看到由jQuery綁定的處理程序。 http://firequery.binaryage.com/

+11

你怎麼知道它是用jQuery連接的? – 2012-08-06 17:10:56

+0

FireQuery似乎是我正在尋找的東西,有了這個工具,我總是可以知道哪些事件綁定到了任何元素上?還有onchange事件,onmouseover等。 – 2012-08-06 17:17:00

+4

這不會通過DOM級別1 + 2聽衆普通的JavaScript – jAndy 2012-08-06 17:18:50

5

使用jQuery("#buy").data('events');

http://api.jquery.com/jQuery.data/可能是有趣。

+2

你怎麼知道它是與jQuery的約束,並直接綁定到元素? – 2012-08-06 17:19:04

+0

這已經過時了。 – pimvdb 2012-08-06 17:43:40

+0

控制檯說,這是「不確定」。 – derloopkat 2013-12-12 12:54:32

0

你使用jQuery嗎?如果是這樣,你要尋找這些三行代碼之一:內置了

$("#buy").click //the div is refered by its id 

$(".buy").click //the div is refered to by the style "buy" 

$(".button").click //refered to by the style "button" 

大多數較新的瀏覽器有「開發工具」按F12(至少在IE和Chrome中)。這可能有助於您進一步調試和跟蹤。

+0

感謝名單,我可以看到該函數的身體時,我提醒,但我不能看到它的位置,所以我可以對其進行編輯。 – 2012-08-06 17:12:05

+5

還有更多的元素結合不僅僅是那些方式。即使'click'被使用,選擇器可能會非常不同。 – 2012-08-06 17:12:14

4

使用傳統的element.onclick=處理函數或HTML <element onclick="handler">附加的事件處理函數可以從腳本或調試器中的element.onclick屬性中檢索得到。

使用DOM Level 2 Events附加的事件處理程序addEventListener方法和IE的attachEvent目前無法從腳本中檢索。 DOM Level 3曾經提出element.eventListenerList來獲取所有偵聽器,但是目前還不清楚這是否會使其達到最終規範。今天在任何瀏覽器中都沒有實現。

13

你不能通過使用ECMAscript本身的「正義」來以非常好的方式做到這一點。舉例來說,如果有通過DOM 1級

document.getElementById('buy').onclick = function() {}; 

形式添加click事件處理程序,你當然也可以很容易地攔截節點本身上該屬性。事情變得越來越複雜,如果DOM級別2分別與.addEventListener().attachEvent()發揮作用。現在你並沒有真正的「地方」來尋找所有綁定的不同監聽器函數的位置。

它通過使用jQuery變得更好。 jQuery將把它的所有事件處理函數放在一個特殊的對象中,該對象鏈接到調用的DOM節點。您可以通過獲取.data() -expando屬性像

$('#buy').data('events'); 

但是一個節點檢查的是,現在我已經描述的事件監聽器綁定到一個節點(實際上它的兩個,因爲像jQuery庫還採用了三種不同的方式當然DOM級別1或2的方法)。

如果某個事件是由委派觸發的,那真的很難看。這意味着,我們將點擊事件綁定到某個父節點上,等待該事件冒泡給我們,以便我們檢查target。所以現在我們甚至沒有nodeevent listener之間的直接關係。

這裏的結論是,瞭解一個瀏覽器插件或可能是像VisualEvent這樣的東西。

+0

+1徹底的答案。唯一的問題是,如果事件綁定到祖先,'.data('events')'解決方案將無濟於事。 – 2012-08-06 17:13:39

+0

@amnotiam:你說得對,我會在那裏添加一個部分。 – jAndy 2012-08-06 17:14:09

3

如果你使用的是FireFox,你應該安裝FireBug。一旦你有了,你可以安裝FireQuery,它會告訴你哪些jQuery事件綁定了哪些對象。

http://getfirebug.com/

http://firequery.binaryage.com/

+3

你怎麼知道它是用jQuery連接的? – 2012-08-06 17:09:28

+0

你不知道,但如果是的話,FireQuery會顯示它。 – 2012-08-06 17:12:16

+1

這隻會對通過jQuery綁定的事件起作用。 – jAndy 2012-08-06 17:13:27

0
  1. 右鍵單擊頁面,並選擇查看頁面的源
  2. 查找<script>標籤
  3. 查找$("#buy")和東西提onClick.on("click",function(){...});
  4. 如果你找不到它,沿着t尋找東西HESE線:document.getElementById("buy")
  5. 你已經找到了function,或代碼,在事件處理程序代碼是

$("#buy")是說發現有buyid屬性的元素的JQuery的方式,如果它有一個.跟着它的一些函數,該函數正在處理由JQuery找到的元素。

+1

如果它被綁定到祖先會怎麼樣? – 2012-08-06 17:17:09

+0

它必須是在外部源:S – 2012-08-06 17:18:49

+0

@VasoApostolidou如果所以會有''某處在頁面上。在'src'屬性中找到該JS文件並導航到它。 – 2012-08-06 17:22:12

2

以下是我以前使用過的東西,我想可能是您要找的東西。它所做的是在頁面元素上觀察屬性(在下面的示例中,它是文檔的「Title」屬性),然後在JS屬性發生更改時使用JS調用堆棧顯示警報。在你試圖找到任何代碼的情況下,你需要先把它加入到DOM中,但是希望你能夠找出導致問題的原因。

我會推薦使用Firefox和Firebug進行JavaScript調試。

// Call stack code 
function showCallStack() { 
    var f=showCallStack,result="Call stack:\n"; 

    while((f=f.caller)!==null) { 
     var sFunctionName = f.toString().match(/^function (\w+)\(/) 
     sFunctionName = (sFunctionName) ? sFunctionName[1] : 'anonymous function'; 
     result += sFunctionName; 
     result += getArguments(f.toString(), f.arguments); 
     result += "\n"; 
    } 
    alert(result); 
} 


function getArguments(sFunction, a) { 
    var i = sFunction.indexOf(' '); 
    var ii = sFunction.indexOf('('); 
    var iii = sFunction.indexOf(')'); 
    var aArgs = sFunction.substr(ii+1, iii-ii-1).split(',') 
    var sArgs = ''; 
    for(var i=0; i<a.length; i++) { 
     var q = ('string' == typeof a[i]) ? '"' : ''; 
     sArgs+=((i>0) ? ', ' : '')+(typeof a[i])+' '+aArgs[i]+':'+q+a[i]+q+''; 
    } 
    return '('+sArgs+')'; 
} 

var watchTitle = function(id, oldval, newval) { showCallStack(); } 

// !! This is all you should need to update, setting it to whatever you want to watch. 
document.watch("title", watchTitle); 
+0

'watch'方法大概只支持Firefox(Gecko瀏覽器)? – MrWhite 2012-08-08 09:16:49

2

這是我發現的是如何做到這一點的最簡單的方法: http://www.sprymedia.co.uk/article/Visual+Event

當與JavaScript事件的工作,往往容易失去跟蹤 什麼事件被認購哪裏。如果您使用大量事件,這在使用逐步增強的現代 接口中很常見,這一點尤其如此。 Javascript庫也 從技術點 爲聽衆增加了另一種程度的複雜性,而從開發人員的角度來看,他們當然可以讓 生活變得更容易!但是當事情出錯時,可能很難追查爲什麼會這樣。

也正是由於這一點,我已經把一個Javascript書籤稱爲 視覺事件,這在視覺上表明 事件將運行已經訂閱了他們 事件,什麼這些事件都是在頁面上的元素和功能當被觸發時。這主要是爲了幫助調試 ,但它也可以是非常有趣且信息豐富的 以查看其他頁面上的訂閱事件。

有一個書籤按鈕,您可以拖動到您的工具欄(FF或Chrome),然後只需點擊任何頁面上您想查看附加事件的按鈕。很棒! (至少對於jQuery或其他庫附加的事件)。

103

在谷歌Chrome瀏覽器的開發者工具(點擊扳手圖標>工具>開發人員工具),選擇元素標籤的元素,在右側打開「事件監聽器」面板中,你會看到所有的事件

+8

+1不錯。我從來沒有注意到Chrome的工具有。 – 2012-08-06 17:25:03

+1

這是我總是這樣做的。 – Gromer 2012-08-06 17:54:39

+4

對於那些熱愛熱鍵的人來說,按下F12也會打開它。 – 2012-08-06 23:26:36

9

您可以使用「Visual Event 2」腳本作爲書籤或與Chrome extension相同的腳本。

這個腳本顯示了連接到DOM元素所有的JS事件。

+0

所有DOM級別0事件和所有來自已知版本的廣泛使用的事件框架(jQuery,原型,Mootools,YUI等),實際上。它無法顯示通過純JavaScript附加的DOM級別2事件觀察器。 – Victor 2012-08-08 13:50:15