如何跟踪JavaScript事件(例如onclick onblur)?
有没有一种方法可以调试或者跟踪InternetExplorer7中的每个JavaScript事件?
我有一个错误,它阻止了文本选择后的滚动,而且我也不知道是哪个事件或者操作导致了该错误。我确实想查看例如在移动鼠标时触发了哪些事件。
重新连接源代码需要做很多工作,我有点希望像嗅探器那样向我展示所有触发的事件。
解决方案
这是基本操作,但触发某些内容时,我们可以保留警报或者document.write呼叫。
我们可能想尝试使用Visual Studio 2008及其功能来调试JavaScript代码。
如果问题不是特定于InternetExplorer7,而是在Firefox中发生,则调试JavaScript代码的另一种好方法是Firefox和具有JavaScript调试器的Firebug插件。然后,我们还可以在JavaScript代码中放置" console.log"语句,然后可以在Firebug的"控制台"窗口中查看其输出,而不必使用有时会弄乱事件链的警报。
我不确定确切的代码(自从编写复杂的JavaScript代码以来已经有一段时间了),但是我们可以枚举表单上的所有控件,并添加一个事件,该事件在触发事件时会输出一些信息。
我们甚至可以使用匿名函数来包装必要的信息,以识别触发哪个事件。
显而易见的方法是为各种事件设置一些警报,例如:
element.onclick = function () { alert('Click event'); }
否则,我们可以选择将警报插入dom某个地方的方式,而不会受到干扰。
但是,请认真考虑使用jQuery之类的库来实现功能。许多跨浏览器问题已解决,我们无需再次解决它们。我不确定我们要实现的功能到底是什么,但是我们可能会使用大量的jQuery滚动和选择插件。
我想做的一件事是在JavaScript中创建一个专门用于事件的绑定函数(就像在Prototype库中可以找到的那样),以便它将"事件"对象传递给绑定函数。现在,如果要执行此操作,则可以简单地引发一个跟踪调用,该跟踪调用将为使用它的每个处理程序调用。然后在不需要时将其删除。一个地方。简单。
但是,无论如何调用trace语句,我们仍然希望看到它。最好的策略是让单独的窗格或者窗口处理跟踪调用。 Dojo Toolkit具有一个可在InternetExplorer中运行的内置控制台,并且还有其他类似的功能。做到这一点的经典方法是创建一个新窗口并对其进行" document.write"。
- 我建议为每个跟踪添加一个日期时间。过去对我有很大帮助。
- 调试和警报通常无济于事,因为它会中断正常的事件流。
Matt Berseth可能是我们在使用Trace Console AjaxControlToolkit控件调试ASP.NET AJAX应用程序中寻找的东西。
它基于Yahoo YUI记录器YUI 2:记录器。
博克杜德说:
You might want to try Visual Studio 2008 and its feature to debug JavaScript code.
我已经多次围绕事件处理展开研究,我认为,尽管经典的步进调试器对于跟踪较长的代码运行很有用,但它们在跟踪事件方面并不好。想象一下,侦听鼠标移动事件并在每个事件上闯入另一个应用程序...因此,在这种情况下,我强烈建议我们进行日志记录。
If the problem is not specific to Internet Explorer 7 but also occurs in Firefox, then another good way to debug JavaScript code is Firefox and the Firebug add-on which has a JavaScript debugger.
还有用于Internet Explorer的Firebug Lite。我没有机会使用它,但是它存在。 :-)它的缺点是它不是一个成熟的调试器,但是它具有window.console对象,这正是我们所需要的。
循环浏览页面上定义了onXYZ函数的所有元素,然后向其中添加跟踪:
var allElements = document.all; // Is this right? Anyway, you get the idea. for (var i in allElements) { if (typeof allElements[i].onblur == "function") { var oldFunc = allElements[i].onblur; allElements[i].onblur = function() { alert("onblur called"); oldFunc(); }; } }
@ [nickf]我敢肯定document.all
是InternetExplorer的扩展名。
我们需要添加一个事件处理程序,无法仅"监视"事件。 Microsoft Ajax库的类似jQuery的框架将轻松为我们提供添加事件处理程序的方法。 jQuery之所以出色是因为它的选择器框架。
然后,我使用Firebug(Firefox扩展)并放入一个断点。我发现Firebug比VisualStudio2008容易安装和拆卸。
我的建议是,将FireFox与FireBug一起使用,并使用内置的Debug / Trace对象。他们是一种魅力。