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.

  • Open the Chrome Dev Tools (F12), and go to the Sources tab.
  • Drill down to Mouse -> Click

    (click to zoom)

  • 2. Click the button!

    Chrome Dev Tools will pause script execution, and present you with this beautiful entanglement of minified code:

    Chrome开发工具暂停脚本执行 (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.

  • Press the F11 key (Step In) until desired source code appears
  • Source code finally reached
  • In the jsFiddle sample provided above, I had to press F11 108 times before reaching the desired event handler/function
  • Your mileage may vary, depending on the version of jQuery (or framework library) used to bind the events
  • With enough dedication and time, you can find any event handler/function
  • 期望的事件处理程序/功能


    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:

    在这里输入图像描述

  • Pop open Chrome Developer Tools (F12 or ⌘+⌥+i) and go to settings (upper right, or F1)
  • Right there you'll find a tab on the left called " Blackboxing "
  • And this is where you put the RegEx pattern of the files you want to avoid passing through. For example: jquery..*.js (human translation: jquery.*.js )
  • If you want to skip files with multiple patterns you can add them using the pipe character like so: jquery..*.js|include.postload.js . Or just keep adding them with the "Add" button.
  • Now apply Solution 3 described down bellow.
  • 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 .

  • Now click the element (execution should pause) and here starts the game: just start pressing F11 (which is Step in) to go through all code. Sit tight, there can be a ton of jumps.
  • There will probably be lots of scripts you don't want/need to drag yourself through so combine this with Method 1 described above.

  • 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

    上一篇: jQuery:太多的递归和最大的调用堆栈大小超过

    下一篇: 如何使用开发人员工具在Chrome中找到按钮/元素运行的代码