javascript - how to properly unbind events in Jquery-Mobile using on/off when a page is kept in the DOM? -


as jquery mobile keeps pages in dom when navigating around, page may visited multiple times when going , forth.

if i'm binding page below , inside binding perform page logic, includes "nested element bindings":

// listener page show: $(document).on('pagebeforeshow.register', '#register', function() {      // stuff      // page event bindings:     $(document).on('click.register', '.registersubmitter', function(e) {         //         });     }); 

going , forth causes nested binding attached multiple times.

right trying work around (doesn't work...):

 $(document).on('click', '.registrysubmitter', function(e) {           if ( $(this).attr('val') != true ) {             $(this).attr('val') == true;             //             }      }); 

so i'm allowing first binding pass , block every other binding attempt comes along.

while works, it's far optimal.

question:
how , when should event bindings unbound/offed? there general way (kill all) or have binding per binding? maybe more importantly: better performance-wise binding once , keep or bind/unbind when user comes to/leaves page?

thanks input!

edit:
i'm namespacing events , listen pagehide so:

$(document).on('pagehide.register', '#register', function(){    $(document).off('.registryevents');    }); 

while seems unbind, fires when ever close custom dialog/selectmenu on page, i'm loosing bindings before leaving page. partial answer, should use off(), how bind page being left vs. opening , closing select menu?

when use .on() that, delegating event handling document element, meaning can setup delegated event binding anytime want because document element available.

i've got 2 suggestions:

  • use pageinit or pagecreate event run page-specific bindings when pages added dom , initialized. using method not delegate event bindings within pageinit or pagecreate event handlers because when fire, elements on pseudo-page in dom:

.

$(document).on('pageinit', '#register', function() {     //note `this` refers `#register` element     $(this).find('.registersubmitter').on('click', function(e) {         //     }); }); 
  • bind delegated event handlers once , don't worry when pages in dom:

.

//this can run in global scope $(document).on('click.register', '.registersubmitter', function(e) {     // }); 

basically when bind event using delegation are, actual cpu hit of adding event handler less each time event dispatched (of kind bubbles) has checked if matches delegated event handler's selector.

when bind directly elements takes more time actual binding because each individual element has bound rather binding once document element event delegation. has benefit no code runs unless specific element receives specific event.

a quick blurb documentation:

triggered on page being initialized, after initialization occurs. recommend binding event instead of dom ready() because work regardless of whether page loaded directly or if content pulled page part of ajax navigation system.

source: http://jquerymobile.com/demos/1.1.0/docs/api/events.html


Comments

Popular posts from this blog

django - How can I change user group without delete record -

java - Need to add SOAP security token -

java - EclipseLink JPA Object is not a known entity type -