2010-05-05 80 views
29

如果我创建了一个JQuery小部件(下面的代码示例),然后定义一个“public”方法,除了使用下面的表单之外,还有其他方法可以调用该方法吗?JQuery - Widget公共方法

$("#list").list("publicMethod"); 

我想创建一个系列的所有定义相同的方法(基本上实现相同的接口)的小部件,并能够调用的方法不知道任何有关该窗口小部件我目前调用方法。在当前的表单中,我需要知道我正在执行“列表”小部件上的方法。


下面是使用“public”方法创建窗口小部件的示例。

(function($) { 
    var items = []; 
    var itemFocusIdx = 0; 

    $.widget("ui.list", { 
     // Standard stuff 
     options : { ... }, 
     _create : function() { ... }, 
     destroy : function() { ... }, 

     // My Public Methods 
     publicMethod : function() { ... } 
     ... 
    }); 
}(jQuery)); 
+0

他们是否必须使用$ .widget,还是打开使用继承和$ .fn? – balupton 2010-07-19 02:06:49

回答

22

的jQuery UI部件使用jQuery的$ .data(...)方法间接将窗口小部件类与DOM元素相关联。首选方法来调用小部件的方法正是由马克斯描述...

$('#list').list('publicMethod'); 

...但如果你想现场返回值,你将有更好的运气,称这是这样经由数据的方法:

$('#list').data('list').publicMethod(); 

然而,使用第二种方式侧步骤的整个jQuery的UI部件的图案,并且如果可能的话可能应该避免。

-2

这个怎么样:

$("#list").list.publicMethod 

当你正在ui.list与键扩展:值对集合

+0

似乎没有工作 – thomaux 2012-02-27 09:36:02

0

试试这个:

$("#list").list("publicMethod"); 
+4

这正是OP试图不这样做...... – thomaux 2012-02-24 10:29:53

2

稍微偏离主题,我知道,但你可能想看看jquery Entwine

这提供了一种继承和多态的形式,允许一些聪明的行为与简单的代码。这听起来像这会做你正在做的事情。

1

可以说你有listlist2,并superList ......让我们称之为“publicMethod”对他们每个人:

$.fn.callWidgetMethod = function(method) { 
    var $this = this, 
     args = Array.prototype.slice.call(arguments, 1); 

    // loop though the data and check each piece of data to 
    // see if it has the method 
    $.each(this.data(), function(key, val) { 
    if ($.isFunction(val[method])) { 
     $this[key].apply($this, args); 

     // break out of the loop 
     return false; 
    } 
    }); 
} 

$("#some-element").list(); 
$("#another-element").list2(); 
$("#hydrogen").superList(); 

$("#some-element").callWidgetMethod("publicMethod"); 
$("#another-element").callWidgetMethod("publicMethod"); 
$("#hydrogen").callWidgetMethod("publicMethod"); 
0

该解决方案通过@ Jiaaro的解决方案的启发,但我需要一个返回值并作为JavaScript函数实现,而不是扩展jQuery:

var invokeWidgetMethod = function(methodName, widgetElem) 
    { 
     var $widgetElem = $(widgetElem), 
      widgetData = $widgetElem.data(), 
      dataName, 
      dataObject; 

     for(dataName in widgetData) 
     { 
      dataObject = widgetData[dataName]; 
      if ($.isFunction(dataObject[methodName])) { 
       return dataObject[methodName](); 
      } 
     } 
    }