ajax - jQuery - Off() not working depending of the event -
i'm using "off event" avoid multiple ajax requests (if user multiple clicks, example). works perfectly.
the problem is, depending on how "on('click')" event called, event off() doesn't work. give example:
function:
var addcomment(elem) = function(){ $.ajax({ type: "post", url: '../../ajax/request.php', datatype: 'json', data: data, beforesend: function(){ // after line, click elem doesn't elem.off('click'); }, success: function(result){ if (result.success){ console.log('success!'); }else{ console.log('no success...'); } //making "elem" clickable again elem.on('click',function(){ addcomment(elem); }); }, error: function(xhr, ajaxoptions, thrownerror){ alert("error status: " + xhr.status + " thrown errors: "+thrownerror); } }); } events:
// using this, off event works $('.divarea button.newcomment').on('click',function(){ addcomment($(this)); }); // using this, off event not executed $('.divarea') .on('click', 'button.newcomment',function(){ addcomment($(this)); }) why in second case, off() doesn't work , should off() works in both event calling examples?
thanks in advanced.
the reason second version doesn't work because when use delegation, event binding not on button, it's on .divarea. delegation works having handler automatically check whether target of event matches selector delegated -- that's how it's able extend elements didn't exist @ time binding established.
since there no bindings on individual elements, can't remove them .off.
what can delegate selector class, , change class when handle event.
$('.divarea').on('click', 'button.newcomment:not(.handled)', function() { addcomment($(this)); }); function addcomment(elem) { $.ajax({ type: "post", url: '../../ajax/request.php', datatype: 'json', data: data, beforesend: function(){ // after line, click elem doesn't elem.addclass("handled"); }, success: function(result){ if (result.success){ console.log('success!'); }else{ console.log('no success...'); } //making "elem" clickable again elem.removeclass("handled"); }, error: function(xhr, ajaxoptions, thrownerror){ alert("error status: " + xhr.status + " thrown errors: "+thrownerror); } }); }
Comments
Post a Comment