Preventing Default Actions In A Bubbled Event In jQuery

Posted June 12, 2009 at 3:07 PM

Tags: Javascript / DHTML

I was just reading over on Jon Hartmann's blog about leveraging event bubbling in jQuery. It's a very cool concept and one that I have not played around with enough so far. When I was reading his post, however, I immediately wondered if default actions could be prevented using this technique. For example, if I have links within a list and the click handler is on the list (UL), can I prevent the default action of the link (navigate away from page) once the event has bubbled up beyond the link? Or, is it too late at that point? To test this, I put together a little demo in which the ancestor element, the UL, prevents the default on all actions:

 
 
 
 
 
 
 
 
 
 

As you can see from the video, even though the UL is handling an event that has bubbled past the link (target element), it is still able to prevent the default action of the link navigation. I'm sure if I had a richer understanding of the browser's event model, this would be obvious; but, I'm still learning. If I had to extrapolate this out into a meaning, it seems that you have the ability to control an event outcome until the browser has stopped handling it at every different level of listening.

Here is the code that I executed in the demo:

 Launch code in new window » Download code as text file »

  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  • <html>
  • <head>
  • <title>Event Bubbling In jQuery</title>
  • <script type="text/javascript" src="jquery-1.3.2.js"></script>
  • <script type="text/javascript">
  •  
  • // When the DOM is ready to be interacted with,
  • $(function(){
  •  
  • // Bind click event handling on the UL. This will allow
  • // us to handle both link and LI clicks in one place
  • // by leveraging event bubbling.
  • $( "ul" ).click(
  • function( objEvent ){
  •  
  • // Return FALSE to prevent the default.
  • return( false );
  •  
  • }
  • );
  •  
  • });
  •  
  • </script>
  • </head>
  • <body>
  •  
  • <h1>
  • Event Bubbling In jQuery
  • </h1>
  •  
  • <ul>
  • <li>
  • Go to <a href="http://www.t-nation.com">T-Nation</a>
  • </li>
  • <li>
  • Go to <a href="http://www.cfbloggers.com">CF Bloggers</a>
  • </li>
  • <li>
  • Go to <a href="http://www.nycfug.com">NY CFUG</a>
  • </li>
  • </ul>
  •  
  • </body>
  • </html>

I am not sure that I know what kind of situation this is best suited for; but, I think it's worth playing around with some.

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Permalink  |  Other Searches  |  Print Page



Learning ColdFusion 9 - ColdFusion 9 tutorials, samples, examples, demos

Reader Comments

Jun 12, 2009 at 6:25 PM // reply »
21 Comments

I've been using this technique for a while now.
In one example I have a link that has different functions when JavaScript is disabled or not.
With JavaScript is disabled, the link opens a new page with a form.
With JQuery (JavaScript Enabled), the link opens a JQuery UI Dialog, and loads the form via the JQuery load() event. I use return false to prevent the browser from navigating to the page with the form.

Very useful!


Jun 12, 2009 at 6:53 PM // reply »
6,348 Comments

@Brian,

Sounds like cool stuff. I love jQuery!


Jun 13, 2009 at 10:29 AM // reply »
1 Comments

I have had the same problem with Java, thanks for the information. I am pretty new at this and all the help I can get is way appreciated. Thanks again. Spence


Jun 13, 2009 at 10:36 AM // reply »
15 Comments

You're right about the fact that it is due to the browser's event model.


Jun 13, 2009 at 6:38 PM // reply »
6 Comments

I usually target anchors specifically with a ev.preventDefault() and override to whatever behavior I wish.

I've not tested this, but judging by the online documentation ... if I were to do preventDefault() on my anchors and bind some event to the ul, jQuery would still bubble up and I could even fire the default behavior that I initially prevented on the anchor. This could be a new way to identify anchor events by their parents rather than looking up the information directly from the anchor. Pretty cool if it works that way


Jun 15, 2009 at 8:37 AM // reply »
6,348 Comments

@Drew,

Right, I believe you'd have to get the reference to the target first, before you could look up any info. Example:

$( objEvent.target ).attr( "href" )


Jun 15, 2009 at 11:10 AM // reply »
1 Comments

I think the example above its pretty good, I think another key point is to mention is garbage collection and memory management, if you were to create a listener for lets say two hundred objects that doesn't seem so bad, but just wait when the page crawls to a halt in ie, its better to listen to an object such as a parent div, then find out which child element fired off the event, the performance gains are huge. Now if you were to use prototypejs instead of jquery, you can create custom events, as well it has support for binding, getting around the problem of scoping with the keyword this, its particuallry handy when using a method as event listener rather than a function as shown in the example above.


Jun 15, 2009 at 11:26 AM // reply »
21 Comments

@James: How's the performance of using the JQuery live() event binding method?


Post Comment  |  Ask Ben

Recent Blog Comments
Justin
Nov 3, 2009 at 3:00 PM
A Moment That Touched Me - The Fountainhead
Well, I'm just going to go back to your mind blowing jquery single page application code. I feel better there. ... read »
Nov 3, 2009 at 2:57 PM
19.0 Must Be Within Range: ( 1 : 12 )
@Troy, Yeah, that'll get you ever time :) Good catch. ... read »
Nov 3, 2009 at 2:56 PM
A Moment That Touched Me - The Fountainhead
@Justin, I suppose it comes down to what we define as sacrifice. I don't think Rand talked about delivering a quality life style to everyone; I think she merely talked about one not being able to a ... read »
Troy
Nov 3, 2009 at 2:43 PM
19.0 Must Be Within Range: ( 1 : 12 )
I recently had a similar ColdFusion error with no line number information to help: 11.0 must be within range: ( 1 : 7 ) The date in my Form variable was "11/11/2009" and I was doing this: DayOfWee ... read »
Justin
Nov 3, 2009 at 2:40 PM
A Moment That Touched Me - The Fountainhead
@Ben and @Brian, Someone will have to sacrifice. There are just too many people living too close together. We can't ignore that reality. ... read »
Nov 3, 2009 at 2:19 PM
A Moment That Touched Me - The Fountainhead
"I believe that part of her (Rand's) philosophy was that one could not pursue things that asked others to sacrifice themselves." Agreed. That's one of the important points people tend to overlook wh ... read »
Nov 3, 2009 at 2:07 PM
A Moment That Touched Me - The Fountainhead
@Justin, Certainly, we don't have to go overboard - I agree. After all, I just wanted to post a passage that I found moving. And, as with anything that is moving, it is that way to some and not to ... read »
Justin
Nov 3, 2009 at 2:00 PM
A Moment That Touched Me - The Fountainhead
I really don't want to string this out as I will be out maneuvered by the more astute posters. However, blogs are for opinions, even plebes, right? If your pursuit for self-fulfillment interferes wi ... read »