The following avoids browser sniffing for IE's submit. It simply creates a div inside a form, then dispatches a submit event and sees if it bubbles.
I'll see if something similar works for change in Safari and IE. jQuery(function(){ var sendEvent = function(type, element){ var event; if (element.ownerDocument.createEvent) { event = element.ownerDocument.createEvent("Events"); event.initEvent(type, true, true); } else { event = element.ownerDocument.createEventObject(); event.type = type; } if(element.dispatchEvent){ return element.dispatchEvent(event) }else{ try {window.event = event;}catch(e) {} return element.fireEvent('on'+type, event); } } var div = document.createElement("div"); div.style.display = 'none' div.innerHTML = "<form action='run'><input type='submit'/></form>" var form = div.firstChild; document.body.appendChild( div ); jQuery.support.submitBubbles =false $(div).submit(function(ev){ jQuery.support.submitBubbles = true;ev.stopPropagation()}) $(form).submit(function(ev){ ev.preventDefault();}) sendEvent("submit",form) document.body.removeChild( div ); div = null; form = null; alert(jQuery.support.submitBubbles) }); On Sep 14, 12:16 am, Justin Meyer <justinbme...@gmail.com> wrote: > WARNING: Skip to the end to avoid an in depth discussion of the > problems, and the only questions I need guidance. > ------------------------------------------------------------------------ > I'm going to replace JMVC's delegation > lib:http://code.google.com/p/javascriptmvc/source/browse/branches/2_0/jmv... > with live. > > I've mentioned this once before, but I'm energized after hearing > almost everything I wanted previously is a priority. > > I was under the impression that the current (trunk?) code supported > submit, but after testing, it seems like it doesn't work in IE. The > code seems to speak to that too. Am I looking in the right place? > > A few thoughts on live and using delegation. Performance of closest > is critical if you want to support events like mouseover choosing > between > 10 different selectors. In almost all cases, getting the > parentNode list is the most expensive part. This is from a lot of > experience with JMVC, and it only has to calculate this list once. To > support rapid event delegation, I suggest adding a 2nd parameter to > closest which would be a cached array of the parent list. > > I've been sorta shot down by Brandon, but I don't like having to run a > query when I attach live functions. If I have 10s of thousands of > '.todo' elements on my page (which is the reason I am using live in > the first place), I don't want to have to do a $('.todo'). Using > 'live' is familiar to those who used liveQuery, but delegate would be > a better name. > $().delegate('.todo','click',function(){ ... }) > But, I realize that this is almost certainly never going to happen. > Maybe there can be a $.live where I can provide the context? > > The next suggestion would be adding a stopPropagation to event. > LiveHandler would check if it has been called and will simply stop > delegated events on the element without returning false from > liveHandler. There are many cases where this is needed in our code. > > But getting to the most important question - how to get submit and > change working? > > For submit and change, you have to listen to multiple events (and > later be able to stop listening). It doesn't seem there is a good way > to do this in event.add. What would be the best way of doing this? > > JMVC uses before and after filters for certain event / browser pairs > to make sure things are ok. For example, in IE you listen for clicks > + keypress instead of submit. The beforeFilter makes sure the target > is an submit input. > > For change in IE on a select, I listen for clicks, make sure the > selector matches the element, then the after filter checks if there is > a value (in $.data("_change_data")). If not, there hasn't been a > change, so it saves the current value. If there is a value, and it is > different, the filter 'approves' the change. > > There are a few issues with this. The most important is that I am > browser sniffing like crazy. I'm not sure if this can be done w/o > browser sniffing. The only thing I think could even work is creating > a form, dispatching a synthetic 'submit' event via fireEvent/ > dispatchEvent. Obviously, that would suck and I am not sure it will > even work. I'm open to suggestions before I try. > > The second issue is that I am putting data in _change_data. Is there > a better place for this? > > Another thing, you need to have capture option passed to event.add so > focus and blur will work. > event.add = function(elem, types, handler, data, capture){ ...} > Would this be ok? > --------------------------------------------------------------------------- > ------ > So, I can happily build all of this if I can get guidance on the 2 > most important problems: > Best way to listen and remove multiple events for a single delegated > event? (EX: delegate on submit, listen for keypress and click) > How to avoid browser sniffing. (EX: know that submit doesn't bubble in > IE). > > Thanks! --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to jquery-dev@googlegroups.com To unsubscribe from this group, send email to jquery-dev+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---