开发者

How to attach 'dblclick' to an element but not its descendants?

I have a basic list-item with an embedded list that I'd like to open when I double click anywhere in the li that isn't the embedded ul.

<ul>
    <li class="first_level">
        <span class="name">List Name</span>
        <ul class="tools"></ul>
        <ul class="sublist">
            <li>Subitem 1</li>
            <li>Subitem 2</li>
            <li>Subitem 3</li>
        </ul>
    </li>
</ul>

In the example above I would like to have any where in .first_level to be attached to dblclick to toggle the .sublist to visible and not visible but I don't wan开发者_JAVA百科t this to happen if I dblclick on .tools, .sublist, or .name.

Basic code:

$('.first_level, .first_level :not(*)').dblclick(function(e){
    $(this).find('.sublist').toggle();
});

I thought my :not(*) would tell it not to attach it to the children but it didn't work. My .first_level has a min-height so my initial idea also had me check the coordinates of the click event within the element and if it was within the min-height to toggle. That solved the problem of it grabbing in the sublist but my tools and name was still a problem (not the best solution but it was succint). So what selector am I forgetting to use here?

http://jsfiddle.net/8PNEn/1/


Just make sure the double-click is done on .first_level

$('.first_level').dblclick(function(e) {
    if ($(e.target).hasClass('first_level')) {
        $(this).find('.sublist').toggle();
    }
});

http://jsfiddle.net/8PNEn/9/


You're probably going to have to do a little bit of logic in your handler, rather than relying on the selector. Perhaps this, using closest and is:

$('.first_level').dblclick(function(e) {
    if ($(e.target).closest('li').is(this)) {
        $(this).find('.sublist').toggle();
    }
});

This starts from the event target (the element that was double-clicked), then traverses up the tree to find the nearest li element, and then sees whether that li element is the element where the function is handled, i.e. .first_level. If it is, then the sublist is toggled.

jsfiddle


Have you tried canceling the event propagation for the name tools and sublist dom? It would look something like this:

// attach double click to first level dom
$('.first_level').dblclick(function(e){
    $(this).find('.sublist').toggle();
});

// cancel even propagation for name, tools, and sublist dom
$('.name, .tools, .sublist').dblclick(function(e){
  e.stopPropagation();
});

http://jsfiddle.net/DbuQ5/


Would that be a good way to do it : http://jsfiddle.net/DavidLaberge/8PNEn/6/


Because my live code doesn't actually have the .first_level class I ended up using a hybrid solution between the accepted answer and the one that currently has the most up-votes. I decided to post my solution as an answer and not edit my question just to stay consistent with the site's functionality :)

$('ul > li').dblclick(function(e) {
    if (e.target == this) {
        $(this).find('.sublist').toggle();
    }
});
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜