Tuesday, January 31, 2012

Avoid event fireing for both parents and children


I have a menu built this way:




ul
li
a
li
a
li
a



The problem I am having is this: When a user clicks li a the li-function fires as well. The li -function should only fire if someone clicks just the li (misses on the a-tag).




$('#stromSkjemaTabs li').children().mousedown(function () {
$('#console').append('debug1 <br />');
});
$('#stromSkjemaTabs li').mousedown.(function () {
$('#console').append('debug2 <br />');
});



Is there any way of writing this so only one of the functions fires? When clicking the li a the function containing "debug1" should fire (NOT debug2 too). When clicking li the debug2 should fire.



I've tried every combination of children() but I can't get this to work.



Any cleaver heads out there?

2 comments:

  1. Change this..

    $('#stromSkjemaTabs li').children().mousedown(function () {
    $('#console').append('debug1 <br />');
    });


    to this-

    $('#stromSkjemaTabs > li > a').mousedown(function (e) {
    e.stopPropagation();
    $('#console').append('debug1 <br />');
    });


    uper one will fire mousedown event on all the children of li, whether it is a or not.

    ReplyDelete
  2. The stopPropagation() function
    Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.

    Here's an example in your case: http://jsfiddle.net/DRnBN/42/

    $(document).ready(function () {
    $('li').mousedown(function () {
    $('#console').append('debug1 <br />');
    });

    $('li').children().mousedown(function (event) {
    event.stopPropagation();
    $('#console').append('debug2 <br />');
    });
    });

    ReplyDelete