我是一名新程序员,还在学习中。
这是我正在努力理解的代码:
<div id="buy" class="buy button">Buy</div>
当我点击div(按钮)时,会执行一些JavaScript代码,但我不知道它在哪里。如何确定单击发生时触发了哪个函数?某种方式上,监听器已附加到此元素。
我是一名新程序员,还在学习中。
这是我正在努力理解的代码:
<div id="buy" class="buy button">Buy</div>
当我点击div(按钮)时,会执行一些JavaScript代码,但我不知道它在哪里。如何确定单击发生时触发了哪个函数?某种方式上,监听器已附加到此元素。
如果你使用Firefox和Firebug,你可以尝试安装FireQuery插件。它可以让你看到由jQuery绑定的处理程序。http://firequery.binaryage.com/
你不能仅用 ECMAscript 来实现一个真正好的方法。例如,如果通过DOM Level 1添加了一个点击事件处理程序,形式为:
document.getElementById('buy').onclick = function() {};
当然,你可以轻松地拦截节点本身的属性。如果涉及到DOM Level 2和 .addEventListener()
或 .attachEvent()
,情况会变得更加复杂。此时,你将没有“位置”可以查找所有不同的监听函数是从哪里绑定的。
使用jQuery可以让事情变得更简单。jQuery将所有事件处理程序函数保存在一个特殊对象中,该对象与调用的DOM节点链接在一起。你可以通过获取节点的 .data()
扩展属性来检查它。
$('#buy').data('events');
然而,现在我已经描述了三种不同的将事件监听器绑定到节点的方法(实际上只有两种,因为像jQuery这样的库当然也使用DOM Level 1或2方法)。
如果一个事件是通过委托触发的,那么情况就真的很糟糕了。这意味着,我们将单击事件绑定在某个父节点上,等待该事件冒泡到我们这里,以便我们可以检查 target
。所以现在,node
和event listener
之间甚至没有直接关系。
总结一下,要注意浏览器插件或类似VisualEvent的东西。
.data('events')
解决方案将无法起作用。 - user1106925使用jQuery("#buy").data('events');
element.onclick=
或HTML<element onclick="handler">
添加的事件处理程序可以轻松地从脚本或调试器中检索到element.onclick
属性。使用DOM Level 2 Events addEventListener方法和IE的attachEvent添加的事件处理程序目前无法从脚本中检索。DOM Level 3曾经提出element.eventListenerList来获取所有监听器,但不清楚它是否会成为最终规范。今天没有任何浏览器实现此功能。你是否正在使用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中如此),即可帮助您进行进一步的调试和跟踪。
click
,选择器也可能会完全不同。 - user1106925// 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);