代码之家  ›  专栏  ›  技术社区  ›  Mark Rogers

是否可以在jquery插件中编写第二个非静态的、选择的、私有的函数?

  •  2
  • Mark Rogers  · 技术社区  · 15 年前

    我读过的jquery教程中的几乎所有示例,通常都使用一个主要的公共函数来选择插件。当我说“选择”插件时,我的意思是它不仅仅是一个扩展到jquery的静态函数。

    例如:

    (function($) {
    
    jQuery.fn.actionList = function(options) {
        var opts = $.extend({}, $.fn.actionList.defaults, options);
        return this.each(function(){
           alert(this);
        });
    
    };
    
    $.fn.actionList.defaults = {
        listHtml: '<div>Set the list html</div>'
    };
    
    })(jQuery);
    

    但不是:

    jQuery.log = function(message) {
      if(window.console) {
         console.debug(message);
      } else {
         alert(message);
      }
    };
    

    这对大多数事情都很好,但是我想做的是能够对第一次调用返回的对象调用第二个函数。

    var actionBox = $('actionBox').actionList(options);
    
    //Many light-cycles later
    
    actionBox.refreshData(data);
    

    或者甚至:

    $('actionBox').actionList(options);
    
    // laaateerr
    
    $('actionBox').actionList.refreshData(data);
    

    我猜其中一个或两个都不可能,或者至少不可取,但我现在才深入了解jquery和javascript的最深层次。

    有人能解释怎么做吗?如果不可能或不明智,为什么?他们会做什么呢?

    谢谢你的阅读!

    2 回复  |  直到 15 年前
        1
  •  2
  •   Russ Cam    15 年前

    我不太确定您在做什么,但是您可以对从第一个函数返回的对象调用第二个函数——事实上,非常鼓励您从插件返回jquery对象,以及为什么可以在jquery中链接命令。

    用你的例子

    var actionBox = $('actionBox').actionList(options);
    
    //Many light-cycles later
    
    actionBox.refreshData(data);
    

    只要两个都能用就行了 .actionList() .refreshData(data) 命令都返回jquery对象。

    $('actionBox').actionList.refreshData(data);
    

    需要

    $('actionBox').actionList().refreshData(data);
    

    编辑:

    查看jquery源代码,

    jQuery.fn = jQuery.prototype = { 
        /* 
            Load of 'property' functions of jQuery object... 
        */ 
    }
    

    因此,添加属性(a.k.a插件)到 jQuery.fn 扩展jquery对象的原型。当你打电话

    $(selector, context);
    

    返回一个新的jquery对象,使用 init 财产 jquery对象的函数

    jQuery = window.jQuery = window.$ = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context );
    },
    
        2
  •  1
  •   Tres    15 年前

    我想我有一个插件可能对你很有用。它允许您将任何构造函数/对象作为它自己的命名空间应用到jquery,并且您可以像通常使用jquery引用对象集那样使用“this”。使用此[methodname]将对对象等调用方法。

    http://code.google.com/p/jquery-plugin-dev/source/browse/trunk/jquery.plugin.js

    以下是一些代码示例:

    http://groups.google.com/group/jquery-dev/browse_thread/thread/664cb89b43ccb92c/34f74665423f73c9?lnk=gst&q=structure+plugin+authoring#34f74665423f73c9

    大约在页面的一半。

    希望你觉得它有用!

    推荐文章