是否有一种优雅的方法可以在插件内部重载jQuery方法?

Is there an elegant way to overload a jQuery method inside of a plugin only?

本文关键字:方法 插件 内部 jQuery 重载 一种 是否      更新时间:2023-09-26

我今天有点无聊,我想不出一个优雅的解决方案来解决这个问题

我继承了一个插件,我需要修改它,以允许传递一个enableddisabled状态给它,让它分离它的所有事件,显示disabled状态等。

就像jQuery UI 插件一样,我只是想使用…

$('div').myPlugin('disabled');

这个我没有问题。

但是,插件附加了许多没有命名空间的事件。我希望事件具有命名空间,这样我就可以轻松地删除事件。

有许多事件被绑定,所以我想嘿,为什么我不重载bind()来自动附加命名空间呢?

我想出了这个…

(function(oldBind) {
    $.fn.bind = function() {
        if (arguments.length >= 2) {
            arguments[0] += '.my-plugin';
        }
        return oldBind.apply(this, arguments);
    }
})($.fn.bind);  

我把它放在插件的顶部,在return this.each(fn)代码之前。

它似乎工作得很好。

然而,我扔在一个console.log(arguments[1].toString()),并注意到(如我所料)这覆盖了主要的jQuery bind()外的插件。

让这个重载的bind()只对这个插件可用的最好方法是什么?

我应该简单地放置在插件$.fn.bind = oldBind的末尾,还是有一个更简单的方法?

先保存函数,后替换。

var oldBind = $.fn.bind;
$.fn.bind = ...what ever you wanted...
$.fn.bind = oldBind;

这应该可以,它是未经测试的,所以告诉我如果它不工作。