views:

4915

answers:

4

I have two functions bound to a click event at two different times (using jQuery). The order in which they are fired is significant. They are firing in the correct order. The problem is, when the first function returns false, the second function is still firing!

How can I properly cancel the event?

Example code:

$(document).click(function() { 
  alert('a');
  return false;
});

$(document).click(function() {
  alert('b');
});

You will still see the "b" alert message when clicking the page. This is unacceptable!

A: 

Does using unbind help?

$(document).click(function() { 
  alert('a');
  $(this).unbind('click');
  return false;
});
nickf
I still need my second event to fire when the first function does NOT return false. Won't unbinding literally "unbind it"?
Josh Stodola
yeah. it's probably not a great solution overall...
nickf
you can merge my solution with nickf solution and you'll get your behavior :)
fmsf
Problem with unbind is that other bound function will fail to trigger.
Seb
The whole approach seems like a tacky workaround! I need a simple way to cancel the event, nothing more. In regular Javascript, a return means a return, be it true or false. Doesn't seem the same way in jQuery. There HAS to be a way to simulate the "return" functionality using jQuery.
Josh Stodola
jquery is javascript :p, it's just a library, not a new language
fmsf
@Josh: There's no reason to be rude. Cut that out.
Paolo Bergantino
A: 

If what nickf said doesn't work, you could use a small state machine:

var trigger = 0;

$(document).click(function() { 

  alert('a');
  if(you_want_to_return_false) {
    trigger = 1;
    return false;
  }
});

$(document).click(function() {
  if(trigger !== 0) {
  alert('b');
  } 
  trigger = 0;
});

Not the prettiest solution, but it will work.

fmsf
well, my idea *works* it's just that it breaks it at the same time. +1 for this idea though.
nickf
This method breaks exactly the same way as the other one does, except with more code. Correct me if I am wrong.
Josh Stodola
sorry let me redo it
fmsf
A: 

The first thing I'm asking is: why do you have two functions bound to the same click event? Having access to the code, why don't you just make that one single call?

$(function (){
    var callbackOne = function(e){
     alert("I'm the first callback... Warning, I might return false!");
     return false;
    };

    var callbackTwo = function(e){
     alert("I'm the second callback");
    };

    $(document).click(function (e){
     if(callbackOne(e)){
      callbackTwo(e);
     }
    });
});
Seb
Organization. There is a ton of Javascript code in this app, and it is split up into SEVERAL files. This way, each page only downloads what is necessary, resulting in rapid load times. I have an HTTP handler that combines, compresses, and caches them, too, so they all get fetched in one request.
Josh Stodola
Ok. So is there really the need for -1? Just trying to help... Your explanation is enough to let us all know it's not the solution *for you*.
Seb
I did not -1, dude!
Josh Stodola
Sorry then! :) Don't know who would want to waste his reputation by down-voting a possible valid answer for other people...
Seb
+1. I've answered plenty of questions by asking "Why are you doing it this way instead of this other way?" Sometimes the asker isn't aware of or forgot to consider other options.
Spencer Ruport
+14  A: 

Use the stopImmediatePropagation function of the jQuery event object.

Keeps the rest of the handlers from being executed. This method also stops the bubbling by calling event.stopPropagation().

$(document).click(function(event) { 
  alert('a');
  event.stopImmediatePropagation();
  return false;
});

$(document).click(function() {
  alert('b');
});
Ken Browning
Thanks, Ken. I knew this answer was out there somewhere.
Josh Stodola
Thanks for the points :)
Ken Browning
Nice find. I skimmed over the event page and totally missed this one.
Paolo Bergantino
You might want to note that you need to be using jQuery version 1.3 and above for this to work.
Josh Stodola
ah cool! I (obviously) didn't know this existed!
nickf