Is there a "global" unbind function in jQuery, such that I'd be able to remove all bound events from a given namespace? eg:
// assume these are the events bound to different elements
$('#foo').bind('click.myNS', ...);
$('#bar').bind('keyup.myNS', ...);
$('#baz').bind('dblclick.myNS', ...);
// magic occurs here...
$.magicalGlobalUnbindFunction('.myNS');
// ...and afterwards, the three binds from above are gone
All the examples I've seen for unbind require some elements to be selected first. I guess that technically, you could do $('*').unbind('.myNS'), but that seems very inefficient.
You could add myNS as a class to each of the elements where you want to unbind the events.
You need to use jQuery's On and Off methods. Use document as the selector.
$(document).off('.myNS');
$(document).on('click.myNS','#foo', ...);
$(document).on('keyup.myNS','#bar', ...);
$(document).on('dblclick.myNS','#baz',''');
then your methods could look like
$(document).on('click.myNS','#foo', fooClicked);
var fooClicked = function(e){
var $this = $(e.target);
// do stuff
}
You could always wrap $.fn.bind and then cache the necessary refs:
(function ($) {
var origBind = $.fn.bind,
boundHash = {};
$.fn.bind = function (type, data, fn) {
var namespace = '',
events = [];
if (typeof type === 'string') {
// @todo check the allowed chars for event namespaces.
namespace = type.replace(/^[^.]+/, '');
if (namespace.length) {
events = boundHash[namespace];
// Namespaces can hold any number of events.
events = boundHash[namespace] = $.isArray(events) ? events : [];
// Only really need ref to the html element(s)
events.push({
type: type,
fn: $.isFunction(fn) ? fn : data,
that: this.length > 1 ? this.toArray() : this[0]
});
}
}
origBind.apply(this, arguments);
};
// namespace to be muffled. Feel free to qualify a specific event type.
$.muffle = function (namespace, type) {
var events = [];
if (boundHash.hasOwnProperty(namespace)) {
events = boundHash[namespace];
$.map(events, function (event) {
var _type = type || event.type;
if (event.type.indexOf(_type) === 0) {
$(event.that).unbind(_type, event.fn);
}
});
// @todo think of better return value.
return true;
}
// @todo think of better return value.
return false
};
})(jQuery);