$.fn.CustomAlert = function() { alert('boo!'); }; $.CustomAlert = function() { alert('boo!'); };
我明白他们是附加到jQuery对象(或$),但两者之间有什么区别?什么时候应该使用一个或另一个?
谢谢。
解决方法
$ .fn指向jQuery.prototype。您添加的任何方法或属性可用于所有jQuery包装对象的实例。
$ .something将一个属性或函数添加到jQuery对象本身。
当您处理页面上的DOM元素时,使用第一个形式$ .fn.something,并且插件会对元素执行某些操作。当插件与DOM元素无关时,请使用$ .something的其他形式。
例如,如果你有一个记录器功能,那么在DOM元素中使用它并不重要:
$("p > span").log();
对于这种情况,您只需将日志方法添加到jQuery对象iself:
jQuery.log = function(message) { // log somewhere }; $.log("much better");
但是,当处理元素时,您将要使用其他形式。例如,如果你有一个图形插件(plotGraph),它从< table>并生成一个图形 – 您将使用$ .fn。*表单。
$.fn.plotGraph = function() { // read the table data and generate a graph }; $("#soMetable").plotGraph();
在相关的注释中,假设你有一个插件,可以使用元素或独立的,你想以$ .myPlugin或$(“< selector>”)的形式访问myPlugin(),你可以重复使用两者的功能。
假设我们需要一个自定义警报,其中每个警报消息前面加上日期。当用作独立功能时,我们将其作为参数传递给消息,并且当与元素一起使用时,它将使用元素的文本作为消息:
(function($) { function myAlert(message) { alert(new Date().toUTCString() + " - " + message); } $.myAlert = myAlert; $.fn.myAlert = function() { return this.each(function() { myAlert($(this).text()); }); }; })(jQuery);
它被包装在一个自动执行的函数中,所以myAlert不会溢出到全局范围。这是两个插件表单之间的一个示例或重用功能。
如上所述,这是一个很好的做法,返回jQuery包装元素本身,因为你不想打破链接。
最后,我发现了类似的问题:-)
> Difference between jQuery.extend and jQuery.fn.extend?
> jQuery plugin .fn question
> jQuery Plugin Authoring: Why do some do jQuery.pluginName and others jQuery.fn.pluginName?
> in jQuery what is the difference between $.myFunction and $.fn.myFunction?