Here’s how to remove all instances of all plugins from an element if the plugin does not include a destroy method:
$.removeData($element.get(0));
This will not remove the bound events. You have to do that separately.
If the plugin you’re trying to remove has namespaced events, you’re in luck:
// Remove namespaced events added using .on()
$element.off('pluginNamespace');
// Remove namespaced events added using .bind()
$element.unbind('.pluginNamespace');
If not, you can examine all of the events attached to an element:
console.log( '$element events:', $._data($element.get(0), 'events') );
Here’s all wrapped up in a handy function:
var destroyCrappyPlugin = function($elem, eventNamespace) {
var isInstantiated = !! $.data($elem.get(0));
if (isInstantiated) {
$.removeData($elem.get(0));
$elem.off(eventNamespace);
$elem.unbind('.' + eventNamespace);
}
};