Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debug DOM mutations with Firebug before page load

I'm having problems with debugging DOM changes introduced by some JavaScript code I'm running. Somewhere in the code an element's class is changed, and I'm trying to pinpoint where exactly. Unfortunately, the new class name is so generic that searching through all the JS code gives too many results to be a viable option.

I've tried debugging a bit with Firebug, but despite the nice "Break on Attribute Change" feature, I can't get it to work in a way I would want. The Firebug demo works correctly, but it's a post load situation.

The problem seems to be that I want to watch for mutations before the page is fully loaded. I assume that the changes occur somewhere in $(document).ready(), so it's in the DOM, but I can't select elements for UI breakpoints as would be the case with the demo (after page load).

Is there some way to debug this kind of situation other than grepping/going through the code by hand?

like image 838
Karol J. Piczak Avatar asked Apr 30 '11 13:04

Karol J. Piczak


3 Answers

I propose that you remove the target element where its classname is changed. With some luck, you may be able to generate an error in the JavaScript code, so you will find where is your problem.

Otherwise, if it's done by JQuery (addClass), you may want to modify the JQuery code itself just to figure out the callstack.

The code would look like this (make sure this code is the first code called after JQuery inclusion):

(function () {
    var addClass = jQuery.fn.addClass;
    jQuery.fn.addClass = function (value) {
        for (var i = 0, l = this.length; i < l; i++) {
            // Here you put your method to start the debugger if you get your right element
            if (this[i].id === "abc") {
                debugger;
            }
        }
        addClass(value);
    }
})();

Hope that helps.

like image 197
jsgoupil Avatar answered Oct 17 '22 04:10

jsgoupil


This answer may sound pretty lame, but I honestly think the best solution for bugs like this is "deconstructing" your program. Just make a copy of the entire project, then rip it apart. Take out chunks of code one by one. Turn function calls into stub functions or whatever to keep things running. Find the minimal amount of code that triggers the bug. Then the solution should be obvious.

like image 26
Jesse Aldridge Avatar answered Oct 17 '22 04:10

Jesse Aldridge


Have you considered adding a mutation event? The event I think you want, DOMAttrModified, is not supported in webkit, so you might have to test with Firefox or Opera. In fact it is deprecated in DOM level 3.

There are two jQuery plugins for mutation events here (documentation) and here but since you want to do this before page load they might not be the answer.

You are probably best writing your own JavaScript bind for this event - there is an example in the answer to is there an alternative to DOMAttrModified that will work in webkit

I hope this helps.

like image 24
andyb Avatar answered Oct 17 '22 05:10

andyb