Question

Is there a way to debug or trace every JavaScript event in Internet Explorer 7?

I have a bug that prevents scrolling after text-selecting, and I have no idea which event or action creates the bug. I really want to see which events are being triggered when I move the mouse for example.

It's too much work to rewire the source and I kind of hoped there was something like a sniffer which shows me all the events that are triggered.

Was it helpful?

Solution

Borkdude said:

You might want to try Visual Studio 2008 and its feature to debug JavaScript code.

I've been hacking around event handling multiple times, and in my opinion, although classical stepping debuggers are useful to track long code runs, they're not good in tracking events. Imagine listening to mouse move events and breaking into another application on each event... So in this case, I'd strongly advise logging.

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.

And there's also Firebug Lite for Internet Explorer. I didn't have a chance to use it, but it exists. :-) The downside of it is that it doesn't a fully-fledged debugger, but it has a window.console object, which is exactly what you need.

OTHER TIPS

Loop through all elements on the page which have an onXYZ function defined and then add the trace to them:

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();
        };
    }
}

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. Then you can also put console.log statements in the JavaScript code which you can then see the output of in the Console Window in Firebug, instead of using alerts which sometimes mess up the event chain.

@[nickf] - I'm pretty sure document.all is an Internet Explorer specific extension.

You need to attach an event handler, there's no way to just 'watch' the events. A framework like jQuery of the Microsoft Ajax library will easily give you methods to add the event handlers. jQuery is nice because of its selector framework.

Then I use Firebug (Firefox extension) and put in a breakpoint. I find Firebug is a lot easier to set up and tear down than Visual Studio 2008.

It's basic, but you could stick alerts or document.write calls in when you trigger something.

The obvious way would be to set up some alerts for various events something like:

element.onclick = function () { alert('Click event'); }

Otherwise you have a less intrusive option of inserting your alerts into the dom somewhere.

But, seriously consider using a library like jQuery to implement your functionality. Lots of the cross-browser issues are solved problems and you don't need to solve them again. I am not sure exactly of the functionality you are trying to achieve but there are most probably plenty of scrolling and selecting plugins for jQuery you could use.

I am not sure on the exact code (it has been a while since I wrote complex JavaScript code), but you could enumerate through all of the controls on the form and attach an event that outputs something when the event is triggered.

You could even use anonymous functions to wrap the necessary information for identifying which event was triggering.

One thing I like to do is create a bind function in JavaScript (like what you can find in the Prototype library) specifically for events, so that it passes the "event" object along to the bound function. Now, if you were to do this, you could simply throw in a trace call that will be invoked for every handler that uses it. And then remove it when it's not needed. One place. Easy.

However, regardless of how you get the trace statement to be called, you still want to see it. The best strategy is to have a separate pane or window handing the trace calls. Dojo Toolkit has a built-in console that runs in Internet Explorer, and there are other similar things out there. The classic way of doing it is to create a new window and document.write to it.

  • I recommend attaching a date-time to each trace. Helped me considerably in the past.
  • Debugging and alerts usually won't help you, because it interrupts the normal event flow.

Matt Berseth has something that may be the kind of thing you're looking for in Debugging ASP.NET AJAX Applications with the Trace Console AjaxControlToolkit Control.

It's based on the Yahoo YUI logger, YUI 2: Logger.

My suggestion is, use FireFox together with FireBug and use the built-in Debug/Trace objects. They are a charm.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top