扩展一个jQuery插件

13

有人扩展过现有的jQuery插件吗?

我不确定从何处开始。我宁愿不直接复制和修改希望扩展的插件。应该通过原型还是对该插件进行扩展调用来实现?

或者说我只是做梦觉得这样做有意义?

2个回答

10

编辑:正如Seb所指出的那样,这并不严格属于“扩展”插件的例子,更多的是“封装”插件,因此就照原样呈现吧 :)

以下是我之前为了简化使用jquery自动完成插件所做的事情:

// small autocomplete plugin wrapping the full autocomplete plugin for a standard look and feel
(function($) {
    $.fn.standardAutocomplete = function(type) {
        return this.autocomplete(ToAbsoluteUrl("~/System/Autocomplete/" + type), {
            formatItem: formatItem,
            formatResult: formatResult
        });
        // Autocomplete formatting callbacks
        function formatItem(row) { return row[0] + "<span class=\"sub\">" + row[1] + "</span>"; }
        function formatResult(row) { return row[0].replace(/(<.+?>)/gi, ''); }
    }
})(jQuery);

现在这并不是按照“按书本来写”jQuery编码的实践 - 例如,我没有考虑到可能会选择多个元素,但在这种情况下,我知道我永远不会在页面上选择多个元素,所以我想保持简单,并且对我来说“有效”。你也许可以使用类似的方法,也许需要更多的技巧。


其实,我正在考虑那种方法,因为它感觉比复制粘贴更加规范。在将您的答案标记为正确答案之前,请原谅我一段时间坚持“按照书本上的方法”? :) - Chad Ruppert
6
这是一个包装器,它不会扩展任何类或对象。实际上,您正在创建一个使用其他插件的新插件,但不具有其他插件的任何方法或选项 - 在这种情况下,您没有扩展任何内容。 - Seb
我知道这是一个包装器 - 这就是为什么代码注释中说“包装完整的自动完成插件”。我并没有声称这是在“扩展”任何东西,它只是一个例子,当我需要从我正在使用的插件中获得更一致的功能时对我有用。 - Steve Willcock
嗯,既然似乎没有更多的答案了,那就指向Steve吧,因为这至少是一个建议。 - Chad Ruppert
编辑了帖子以指出它实际上并不是扩展,而是封装 - 以便让任何阅读它的人都清楚明白 ;) - Steve Willcock

2
如果插件做得很好,那么你除了使用其选项来更改其行为之外,几乎没有其他选择。
这样做的目的是将所有代码封装起来,不会干扰其他代码,因此您无法向其中注入任何代码。
如果您真的需要更改其行为,那么我想您需要复制并粘贴代码。

1
在典型的继承中,你并不是注入代码,而是扩展对象,创建一个新的对象。在这种情况下,我们不能使用普通的继承吗?我不是想修改现有的方法,而是想添加方法和类似的内容。 - Chad Ruppert
请看我在Steve的回答中的评论,了解我的观点。简而言之,我认为你无法扩展,但可以使用_WRAP_,这与你所要求的完全不同。 - Seb
我明白这是一个包装器,这就是为什么与真正的继承相比,它是我的第二选择 - Chad Ruppert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接