type objects jquery jquery-ui public-method

objects - JQuery-Widget Public Methods



string[] jquery (6)

Si creo un widget de JQuery (ejemplo de código a continuación) y luego defino un método "público", ¿hay alguna otra manera de llamar al método que no sea usar el siguiente formulario?

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

Me gustaría crear una serie de widgets que definan los mismos métodos (básicamente, implementar la misma interfaz), y poder llamar al método sin saber nada sobre en qué widget estoy actualmente invocando el método. En la forma actual, necesito saber que estoy ejecutando el método en el widget de "lista".

A continuación se muestra un ejemplo de creación de un widget con el método "público".

(function($) { var items = []; var itemFocusIdx = 0; $.widget("ui.list", { // Standard stuff options : { ... }, _create : function() { ... }, destroy : function() { ... }, // My Public Methods publicMethod : function() { ... } ... }); }(jQuery));


Esta solución está inspirada en la solución de @ Jiaaro, pero necesitaba un valor de retorno y se implementó como una función de JavaScript en lugar de extender 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](); } } }


Los widgets jQuery UI usan el método $ .data (...) de jQuery para asociar indirectamente la clase de widgets con el elemento DOM. La forma preferida de llamar a un método en el widget es exactamente lo que describió Max ...

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

... pero si desea generar un valor de retorno, tendrá más suerte llamándolo de esta manera, a través del método de datos:

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

Sin embargo, si se utiliza la segunda forma, se avanza lateralmente en el patrón de widgets jQuery UI completo, y probablemente se debería evitar si es posible.


Prueba esto:

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


Que tal este:

$("#list").list.publicMethod

A medida que extiende ui.list con su clave: conjunto de pares de valores


Un poco fuera de tema, lo sé, pero es posible que desee ver jquery Entwine .

Esto proporciona una forma de herencia y polimorfismo que permite un comportamiento inteligente con un código simple. Parece que esto haría lo que intentas hacer.


digamos que tiene list , list2 , y superList ... vamos a llamar "publicMethod" para cada uno de ellos:

$.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");