I think it would be a good idea to switch to live. If you have a patch send it to me and I will take a look.
On Nov 24, 4:26 pm, Josh Jaques <jjaq...@seccuris.com> wrote: > Background on jQuery live: > ------------------------- > The classic way to bind to an event is doing something like: > jQuery("selector").click(function() { > // do some stuff}); > > //Note this is just a wrapper to jQuery("...").bind("click", ...); > > The issue with that method is that it statically binds the event to whatever > elements match your selector AT THE TIME YOU CALL .click(). So if new > elements are dynamically added to the page using javascript, the event > handler won't be attached to those new elements. jQuery also has the .live > function, where events can be bound as follows: > jQuery("selector").live("click", function() { > // do some stuff} > > Using .live(), the click event is now dynamically attached to all elements > that match selector, regardless of the time they are added to the page. > > The issue I was having: > ------------------------------ > So in my example, since web2py initializes its form event handlers with > .bind, when I load a new form onto the page via ajax then it doesn't have any > of the event handlers attached to it. This means the date fields are all > static, delete checkboxes have no confirmation, etc. > > What are thoughts on attaching the events using .live() instead. The only > drawback to .live() I can think of is the increase in performance cost > required to support dynamic events. > > If you want to make it the new default, I'll submit patch. > > -----Original Message----- > From: web2py@googlegroups.com [mailto:web...@googlegroups.com] On Behalf Of > mdipierro > Sent: Wednesday, November 24, 2010 12:51 PM > To: web2py-users > Subject: [web2py] Re: targeted web2py_ajax_init for dynamically inserted forms > > tell us more about jquery live. What do you propose? > > On Nov 24, 11:44 am, Josh Jaques <jjaq...@seccuris.com> wrote: > > If you load a form onto a web2py page via AJAX, it doesn't get the > > enhancements from web2py_ajax_init(). > > > I've included a modified web2py_ajax_init that accepts an optional parent > > selector to provide some scope to web2py_ajax_init. In this way if you load > > a form onto a page, you can call web2py_ajax_init on that specific form to > > give it the enhancements, without effecting every other form on the page. > > > I've included the modified function here as it may be useful to others in > > the future. > > > An alternative approach may be to bind events using jQuery.live(), so that > > you don't have to explicitly call web2py_ajax_init() every time you load a > > form. > > > -------- > > function web2py_ajax_ init(parent) { > > var find = function(selector) { > > if (parent) > > return $(parent).find(selector); > > else > > return jQuery(selector); > > } > > find('.hidden').hide(); > > find('.error').hide().slideDown('slow'); > > find('.flash').click(function() { find(this).fadeOut('slow'); return > > false; }); > > // find('input[type=submit]').click(function(){var > > t=find(this);t.hide();t.after('<input class="submit_disabled" > > disabled="disabled" type="submit" name="'+t.attr("name")+'_dummy" > > value="'+t.val()+'">')}); > > > > find('input.integer').keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); > > > > find('input.double,input.decimal').keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-\.]|[\-](?=.)|[\.](?=[0-9]*[\.])/g,'').reverse();}); > > > > find("input[type='checkbox'].delete").each(function(){find(this).click(function() > > { if(this.checked) if(!confirm("{{=T('Sure you want to delete this > > object?')}}")) this.checked=false; });}); > > try {find("input.date").focus(function() {Calendar.setup({ > > inputField:this.id, ifFormat:"{{=T('%Y-%m-%d')}}", showsTime:false > > }); }); } catch(e) {}; > > try { find("input.datetime").focus( function() {Calendar.setup({ > > inputField:this.id, ifFormat:"{{=T('%Y-%m-%d %H:%M:%S')}}", showsTime: > > true,timeFormat: "24" > > }); }); } catch(e) {}; > > try { find("input.time").timeEntry(); } catch(e) {};}; > > > --------------- > > > This communication, including any attachments, does not necessarily > > represent official policy of Seccuris Inc. > > Please seehttp://www.seccuris.com/Contact-PrivacyPolicy.htm for further > > details about Seccuris Inc.'s Privacy Policy. > > If you have received this communication in error, please notify Seccuris > > Inc. at i...@seccuris.com or at 1-866-644-8442. > This communication, including any attachments, does not necessarily represent > official policy of Seccuris Inc. > Please seehttp://www.seccuris.com/Contact-PrivacyPolicy.htm for further > details about Seccuris Inc.'s Privacy Policy. > If you have received this communication in error, please notify Seccuris Inc. > at i...@seccuris.com or at 1-866-644-8442. > >