javascript - clicking on div fires binding for $('body').click - Stack Overflow

I have a div, I want to set it so that when I click on something else, it would hide the div. So I did

I have a div, I want to set it so that when I click on something else, it would hide the div.

So I did

$('body').click(function(){
    if(loginOpened)
    {
        $('#loginWindow').animate({
            'width':'0px',
            'height':'0px'
        },"fast");
    }
    loginOpened=false;
});

However, even when I click in the div itself the event is fired, is there anyway to prevent this?

I have a div, I want to set it so that when I click on something else, it would hide the div.

So I did

$('body').click(function(){
    if(loginOpened)
    {
        $('#loginWindow').animate({
            'width':'0px',
            'height':'0px'
        },"fast");
    }
    loginOpened=false;
});

However, even when I click in the div itself the event is fired, is there anyway to prevent this?

Share Improve this question asked Oct 18, 2010 at 4:10 Razor StormRazor Storm 12.4k20 gold badges96 silver badges151 bronze badges 0
Add a ment  | 

4 Answers 4

Reset to default 4

You can stop it using

e.stopPropagation(); if there is a click event bound to the <div /> tag.

See event.stopPropagation()

Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.

Otherwise you can check the target of the event inside the body click. Check whether event.target is the same as your div.

See event.target

Just check the event.target. If the element that triggered the event is your div do not execute the code.

$('body').click(function(evt){
    evt = evt || window.event
    if ($(evt.target) != $('#loginWindow')) {
      if(loginOpened)
      {
          $('#loginWindow').animate({
              'width':'0px',
              'height':'0px'
          },"fast");
      }
      loginOpened=false;
    }
});

Yes, but of course Microsoft and the rest of the world came to different conclusions about how to do it. This site gives a good clear rundown of what's needed: http://www.quirksmode/js/events_order.html .

I don't use jQuery but the jQuery way appears to be event.stopImmediatePropagation(); as seen in this question: jQuery Multiple Event Handlers - How to Cancel? .

A couple of changes from John's code:

$('body').click(function(ev){
    // jQuery means never having to say "window.event"!
    // Also, code's cleaner and faster if you don't branch, 
    // and choose simple breaks over more plex ones
    if(!loginOpened) return;
    // Lastly, pare using the DOM element; 
    // jQuery objects never pare as the "same"*
    if (ev.target == $('#loginWindow').get(0)) return;  
    $('#loginWindow').animate({
        'width':'0px',
        'height':'0px'
    },"fast");
    loginOpened=false;
});

If trapping it in the body event doesn't work for you, you can just add a simple event handler to the div:

$('#loginWindow').click(function (ev) { ev.stopPropagation(); });

I was going to say return false, but that would prevent other things from firing off the div. stopPropagation just keeps the event from bubbling outward.

I could be really picky, of course...

//Delegation via the document element permits you to bind the event before
// the DOM is plete; no flashes of unbehaviored content
$(document).delegate('body', 'click', function(ev){
    //You only have one instance of an id per page, right?
    if(!loginOpened || ev.target.id == 'loginWindow') return;
    //quotes and px?  not necessary.  This isn't json, and jQ's smart
    $('#loginWindow').animate({width:0,height:0},"fast");
    loginOpened=false;
});

* Don't believe me? Try:

jQuery('#notify-container') == jQuery('#notify-container') 

Then try

jQuery('#notify-container').get(0) == jQuery('#notify-container').get(0)

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745377373a4625062.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信