【问题标题】:extending jquery with a generic function使用通用函数扩展 jquery
【发布时间】:2011-03-11 02:35:24
【问题描述】:

我正在使用 jquery 为我的网站编写一个通用函数,该函数将用于整个网站以显示成功/错误消息。我决定把它做成一个插件。

一个简单的插件形式如下:

; (function ($) {
        jQuery.FlashMessage=function(msg){
            alert(msg);
        }

})(jQuery);

我想知道在 jquery 命名空间中定义插件是否是一个好习惯,还是应该在 $.fn.XXXX 下定义......

【问题讨论】:

  • 不管你怎么做,function($) 的意义在于,$ 是对传递给底部匿名闭包的jQuery 参数的内部范围引用。因此,您应该在闭包内使用$,而不是jQuery。
  • 看来你不明白$.foo和$.fn.foo的区别。
  • @Sime 是的,这正是他在这里问的原因!

标签: javascript jquery jquery-plugins


【解决方案1】:

您将这些函数添加到 jQuery.fn 应该在选定元素上运行,例如$('div').yourFunction().

如果你想要一个“通用”函数,比如$.ajax(),那么你应该将它添加到 jQuery 对象中,就像你已经做的那样。但我会在函数内部使用$:

(function ($) {
        $.FlashMessage=function(msg){
            alert(msg);
        }

})(jQuery);

所以这取决于你想要什么样的功能。

【讨论】:

  • 但是这种模式不只是将jQuery对象用作命名空间吗?在这种情况下,我宁愿定义自己的命名空间对象,以避免与 jQuery 的内置函数发生冲突。
【解决方案2】:

jQuery.fn 等价于jQuery.prototype

jQuery.fn.FlashMessage 你可以做到

 jQuery.fn.FlashMessage=function(){
    return this.each(function(){
        //do some thing
    });
  });


//use like this, your chaining is secured    
jQuery('#someElement').FlashMessage().DoSomeThingElse().SomethingMore();

如果您担心只修改一个元素而不是为什么使用jQuery.FlashMessage,请像myNameSpace.FlashMessage 那样做

【讨论】:

  • 不,jQuery.fn 不等于 jQuery.prototype。但jQuery.fn 是jQuery(selector) 返回的对象的原型。
  • @gilly 是的。试试jQuery.fn === jQuery.prototype。它评估为真。 fn 用作prototype 的简写名称。
【解决方案3】:

fn namspace 上的插件通常会返回一个 jQuery 对象以保持可链接性。它们也适用于jQuery.prototype,因此所有 jQuery 对象都可以调用它。

查看此页面以获得关于插件创作的一个很好的概述:http://docs.jquery.com/Plugins/Authoring

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2021-01-24
    • 2019-12-15
    相关资源
    最近更新 更多