interesting. this is ending up very similar to $.listen and $.delegate
not being able to handle complex selectors, necessitating a $.is
filter inside the callback to determine more complicated matches such
as :eq, :has, etc.

also, i was wondering why blur, focus, and change weren't included in
$.live. is this a technical hurdle or "ran out of time" thing?...cause
they're pretty important...for me anyways, i have TONS of forms so i'm
wondring if i should $.live only half my app, or wait till the other
events are added. is there a timeframe?

thanks,
Leon

On Jan 20, 11:23 am, John Resig <[email protected]> wrote:
> Documentation updated:http://docs.jquery.com/Events/live
>
> Hope it's clearer now.
>
> --John
>
> On Tue, Jan 20, 2009 at 12:16 PM, John Resig <[email protected]> wrote:
> > Ok, so I looked at this issue more and I think the problem is being 
> > confused.
>
> > Let's pretend that you only had one event bound:
> >> $("#list li").live('click', function(e) {
> >>  alert('li clicked');
> >> });
>
> > That click will triggered if the li is clicked or if the a is clicked
> > - it doesn't matter.
>
> > Now let's look at this case:
>
> >> $("#list li a").live('click', function(e) {
> >>  alert('a clicked');
> >> });
>
> >> $("#list li").live('click', function(e) {
> >>  alert('li clicked');
> >> });
>
> > Just because you have an event bound to an inner element in addition
> > to an outer element shouldn't affect what's going on - there's no
> > bubbling occurring.
>
> > In fact, when thinking about it, I'm not completely sure that
> > .stopImmediatePropagation() should have an effect, either (even though
> > it does, now - for example, if you had bound the events in a different
> > order, the li first, then the li a, even stopImmediatePropagation
> > would've failed).
>
> > So - a solution to your problem, then. I'd recommend enforcing the
> > target within your li live event.
>
> > $("#list li").live('click', function(e) {
> >  if ( $(e.target).is("li") )
> >   alert('li clicked');
> > });
>
> > or:
>
> > $("#list li").live('click', function(e) {
> >  if ( $(e.target).not("a") )
> >   alert('li clicked');
> > });
>
> > The important point is that:
> >  $("#list li").live('click', ...);
>
> > Is actually saying "Anytime a click occurs on an element that matches
> > '#list li' OR on an element contained within an element that matched
> > '#list li' trigger this bound click event on that element." There is
> > no propagation involved there.
>
> > In this way live events are different from normal events - I will make
> > a note of it in the documentation.
>
> > --John
>
> > On Tue, Jan 20, 2009 at 2:18 AM, Walther <[email protected]> wrote:
>
> >> Thanks, e.stopImmediatePropagation()  works fine. But e.stopPropagation
> >> () and return false; doesn't.
>
> >> Sorry John, I don't have example url available.
>
> >> However I can post example code here:
>
> >> <ul id="list">
> >> <li id="item_1"><a href="#">Item 1</a></li>
> >> <li id="item_2"><a href="#">Item 2</a></li>
> >> <li id="item_3"><a href="#">Item 3</a></li>
> >> <li id="item_4"><a href="#">Item 4</a></li>
> >> </ul>
>
> >> Script is:
> >> $("#list li a").live('click', function(e) {
> >>  e.stopPropagation();
>
> >>  alert('a clicked');
> >> });
>
> >> $("#list li").live('click', function(e) {
> >>  alert('li clicked');
> >> });
>
> >> If I change the e.stopPropagation() line to e.stopImmediatePropagation
> >> () then it works fine, thanks Ariel. Could it be a bug, or just me
> >> being stupid (I am good at being stupid)?
>
> >> Walther.
>
> >> On Jan 19, 8:43 pm, Ariel Flesler <[email protected]> wrote:
> >>> $('li a').live('click',function(e){
> >>>   // do stuff with link clicked
>
> >>> });
>
> >>> $('li').live('click',function(e){
> >>>    if( $(e.target).is('a') )
> >>>      return;
> >>>   // do stuff when li is clicked
>
> >>> });
>
> >>> Instead of the "if" within the second handler, you could do
> >>> e.stopImmediatePropagation() on the first.
> >>> Any of those should do.
>
> >>> --
> >>> Ariel Fleslerhttp://flesler.blogspot.com
>
> >>> On Jan 19, 8:21 am, Walther <[email protected]> wrote:
>
> >>> > I am having a issue with the live event functionality in jQuery 1.3.
>
> >>> > Basically, I have a list with various options in this form:
> >>> > <ul>
> >>> > <li><a href="something">Bla</a></li>
> >>> > .
> >>> > .
> >>> > .
> >>> > .
> >>> > </ul>
>
> >>> > I want to do something when the user clicks on the list item (it has a
> >>> > rather wide width), and I want to do something else when the user
> >>> > clicks on the link inside the list item. Since the list is going to be
> >>> > a dynamic list I need to use live events.
>
> >>> > However, when I use live events and click on the <a> tag, the event
> >>> > for the list item is also fired. I have tried putting return false;
> >>> > and event.stopPropagation(); into the event function, it doesn't work.
> >>> > However, when  I use the normal bind() function (instead of live()) it
> >>> > works as intended(expect for it not being a live event which I want).
>
> >>> > I am guessing that I am doing something stupid that is preventing it
> >>> > from working, any help would be apprechiated.
>
> >>> > Regards
> >>> > Walther
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"jQuery Development" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/jquery-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to