Javascript Event Bubbling

后端 未结 2 544
时光说笑
时光说笑 2020-12-06 22:20

I have this setup

1 2 3
相关标签:
2条回答
  • 2020-12-06 22:28

    Change the inline onclick to this:

    onclick="SomeEvent(this, event)"
    

    Then in SomeEvent, do this:

    function SomeEvent( el, event ) {
        var target = event.srcElement || event.target;
    
        if( el === target ) {
            // run your code
        }
    }
    

    This will only fire the code when you click on the div element itself, instead of a descendant.

    If there are other descendants that should fire the handler, then do this:

    function SomeEvent( el, event ) {
        var target = event.srcElement || event.target;
    
        if( target.nodeName.toLowerCase() !== 'input' || !target.type || target.type !== 'checkbox' ) {
            // run your code
        }
    }
    

    This will fire the handler for any click except those on the checkboxes.

    0 讨论(0)
  • 2020-12-06 22:33

    In the event bubbling model, the event propagation is from the inner elements to the outer elements.

    This means that the event.stopPropagation(); should be in the inputs' events instead of the div.

    <div onclick="SomeEvent">
      <input type=checkbox value=1 onclick="stopPropagation()">1
      <input type=checkbox value=2 onclick="stopPropagation()>2
      <input type=checkbox value=3 onclick="stopPropagation()>3
    </div>
    

    Now the Javascript code:

    function stopPropagation() {
      //... do something.
      //stop propagation:
      if (!e) var e = window.event;
      e.cancelBubble = true; //IE
      if (e.stopPropagation) e.stopPropagation(); //other browsers
    }
    

    More info: http://www.quirksmode.org/js/events_order.html

    EDIT: The above was a quick way to show how the bubbling model works, but a better answer to solve this problem using JQuery would be:

    <div id="mydiv">
      <input type="checkbox" value="1" /> 1
      <input type="checkbox" value="2" /> 2
      <input type="checkbox" value="3" /> 3
    </div>
    

    Now the Javascript code:

    $('#mydiv').click(function(e) {
      //do something
    });
    
    $('#mydiv input').click(function(e) {
      //stop propagation:
      if (!e) var e = window.event;
      e.cancelBubble = true; //IE
      if (e.stopPropagation) e.stopPropagation(); //other browsers
    });
    
    0 讨论(0)
提交回复
热议问题