How to find what code is run by a button/element in Chrome using Developer Tools
I'm using Chrome and my own website.
What I know from the inside:
1 ) I have a form where people sign up by clicking this orange image-button:
2 ) I inspect it, and this is all it is: <img class="formSend" src="images/botoninscribirse2.png">
3 ) At the top of the source code, there are tons of script sources. Of course, I know which one the button calls, I coded it : <script src="js/jquery2.js" type="text/javascript"></script>
4 ) Within that file, you could find: $(".formSend").click(function() { ... });
which is what is triggered by the button (to do a fairly complex form validation and submit) and what I want is to be able to find that using chrome dev tools on any website.
How can we find out where does the element call?
Listeners tab didn't work for me
So then I tried looking the click event listeners, which seemed like a safe bet to me but... there's no jquery2.js
in there (and I wouldn't really know which file the code is so I'd waste time checking all these...):
My $(".formSend").click(function() { ... });
function within jquery2.js
file is not there.
Jesse explains why down in his answer:
"Finally, the reason why your function is not directly bound to the click event handler is because jQuery returns a function that gets bound. jQuery's function in turn goes through some abstraction layers and checks, and somewhere in there, it executes your function."
EDIT: I've collected all the methods this question arose in one answer down below as suggested by some of you.
Alexander Pavlov's answer gets the closest to what you want.
Due to the extensiveness of jQuery's abstraction and functionality, a lot of hoops have to be jumped in order to get to the meat of the event. I have set up this jsFiddle to demonstrate the work.
1. Setting up the Event Listener Breakpoint
You were close on this one.
(click to zoom)
2. Click the button!
Chrome Dev Tools will pause script execution, and present you with this beautiful entanglement of minified code:
(click to zoom)
3. Find the glorious code!
Now, the trick here is to not get carried away pressing the key, and keep an eye out on the screen.
4. Explanation
I don't have the exact answer, or explanation as to why jQuery goes through the many layers of abstractions it does - all I can suggest is that it is because of the job it does to abstract away its usage from the browser executing the code.
Here is a jsFiddle with a debug version of jQuery (ie, not minified). When you look at the code on the first (non-minified) breakpoint, you can see that the code is handling many things:
// ...snip...
if ( !(eventHandle = elemData.handle) ) {
eventHandle = elemData.handle = function( e ) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
jQuery.event.dispatch.apply( elem, arguments ) : undefined;
};
}
// ...snip...
The reason I think you missed it on your attempt when the "execution pauses and I jump line by line", is because you may have used the "Step Over" function, instead of Step In. Here is a StackOverflow answer explaining the differences.
Finally, the reason why your function is not directly bound to the click event handler is because jQuery returns a function that gets bound. jQuery's function in turn goes through some abstraction layers and checks, and somewhere in there, it executes your function.
Here are some solutions:
Solution 1 (works great, just a bit of set up but no third parties)
Framework blackboxing:
jquery..*.js
(human translation: jquery.*.js
) jquery..*.js|include.postload.js
. Or just keep adding them with the "Add" button. More about this : https://developer.chrome.com/devtools/docs/blackboxing
Bonus tip : I use Regex101 to quickly test my rusty regex patterns and find out where I'm wrong with the regex step-by-step debugger. There are others of course.
Solution 2 (works great and easy but you need to install an extension)
Visual Event :
Personal favourite. It works wonderfully, but it's an extension, it's not using Chrome's Developer Tools. Just FYI.
Solution 3 (kind of painful but easy)
Opening Dev Tools -> Sources tab, and on the right find Event Listener Breakpoints
:
Expand Mouse
and click on... well, click
.
Solution 4 (survival mode)
I'm always left with Ctr + Shift + F (text search across all sources) and searching #envio
or whatever the tag/id you think starts the party, reading all findings to try figure out what code could be running, feeling a loser and feeling that there's got to be a safe way of really knowing WHAT is triggered by the button.
But be aware sometimes there's not only an img
but tons of divs
overlapping, and you can't even know what triggers the code. You probably shouldn't have to use this method.
Sounds like the "...and I jump line by line..." part is wrong. Do you StepOver or StepIn and are you sure you don't accidentally miss the relevant call?
That said, debugging frameworks can be tedious for exactly this reason. To alleviate the problem, you can enable the "Enable frameworks debugging support" experiment. Happy debugging! :)
链接地址: http://www.djcxy.com/p/71692.html