Estoy tratando de escribir un complemento jQuery que proporcionará funciones / métodos adicionales al objeto que lo llama. Todos los tutoriales que leí en línea (he estado navegando durante las últimas 2 horas) incluyen, como máximo, cómo agregar opciones, pero no funciones adicionales.
Esto es lo que estoy buscando hacer:
// formatee div para que sea un contenedor de mensajes llamando al complemento para ese div
$("#mydiv").messagePlugin();
$("#mydiv").messagePlugin().saySomething("hello");
O algo por el estilo. Esto es a lo que se reduce: llamo al complemento, luego llamo a una función asociada con ese complemento. Parece que no puedo encontrar una manera de hacer esto, y he visto muchos complementos hacerlo antes.
Esto es lo que tengo hasta ahora para el complemento:
jQuery.fn.messagePlugin = function() {
return this.each(function(){
alert(this);
});
//i tried to do this, but it does not seem to work
jQuery.fn.messagePlugin.saySomething = function(message){
$(this).html(message);
}
};
¿Cómo puedo lograr algo así?
¡Gracias!
Actualización 18 de noviembre de 2013: he cambiado la respuesta correcta a la de los siguientes comentarios y votos a favor de Hari.
fuente
this.data('tooltip', $.extend(true, {}, $.fn.tooltip.defaults, methodOrOptions));
así que ahora puedo acceder a las opciones cuando quiera después de la inicialización.init
.Aquí está el patrón que he usado para crear complementos con métodos adicionales. Lo usarías como:
o, para invocar un método directamente,
Ejemplo:
fuente
;
en tu primera línea?¿Qué pasa con este enfoque?
Los objetos seleccionados se almacenan en el mensaje de cierre del complemento, y esa función devuelve un objeto que contiene las funciones asociadas con el complemento, en cada función puede realizar las acciones deseadas a los objetos seleccionados actualmente.
Puedes probar y jugar con el código aquí .
Editar: Código actualizado para preservar el poder de la cadena de jQuery.
fuente
$('p').messagePlugin()
menos que llame a una de las dos funciones que devuelve.El problema con la respuesta seleccionada actualmente es que en realidad no está creando una nueva instancia del complemento personalizado para cada elemento en el selector como cree que está haciendo ... en realidad solo está creando una única instancia y pasando el selector en sí como el alcance.
Vea este violín para una explicación más profunda.
En su lugar, deberá recorrer el selector utilizando jQuery.each e instanciar una nueva instancia del complemento personalizado para cada elemento del selector.
Así es cómo:
Y un violín de trabajo .
Notarás cómo en el primer violín, todos los divs siempre se mueven a la derecha exactamente el mismo número de píxeles. Esto se debe a que solo existe un objeto de opciones para todos los elementos en el selector.
Usando la técnica escrita anteriormente, notará que en el segundo violín, cada div no está alineado y se mueve aleatoriamente (excluyendo el primer div ya que su aleatorizador siempre se establece en 1 en la línea 89). Esto se debe a que ahora estamos instanciando correctamente una nueva instancia de complemento personalizada para cada elemento en el selector. Cada elemento tiene su propio objeto de opciones y no se guarda en el selector, sino en la instancia del complemento personalizado.
Esto significa que podrá acceder a los métodos del complemento personalizado instanciado en un elemento específico en el DOM desde nuevos selectores jQuery y no estará obligado a almacenarlos en caché, como lo estaría en el primer violín.
Por ejemplo, esto devolvería una matriz de todos los objetos de opciones utilizando la técnica en el segundo violín. Volvería indefinido en el primero.
Así es como tendría que acceder al objeto de opciones en el primer violín, y solo devolvería un solo objeto, no una matriz de ellos:
Sugeriría usar la técnica anterior, no la de la respuesta seleccionada actualmente.
fuente
$('.my-elements').find('.first-input').customPlugin('update', 'first value').end().find('.second-input').customPlugin('update', 'second value'); returns Cannot read property 'end' of undefined
. jsfiddle.net/h8v1k2pLjQuery ha hecho esto mucho más fácil con la introducción de Widget Factory .
Ejemplo:
Inicializacion:
Método de llamada:
(Así es como se construye la biblioteca jQuery UI ).
fuente
Un enfoque más simple es usar funciones anidadas. Luego puede encadenarlos de forma orientada a objetos. Ejemplo:
Y aquí está cómo llamarlo:
Pero ten cuidado. No puede llamar a una función anidada hasta que se haya creado. Entonces no puedes hacer esto:
La función DoEvenMore ni siquiera existe porque la función DoSomething aún no se ha ejecutado, lo cual es necesario para crear la función DoEvenMore. Para la mayoría de los complementos de jQuery, realmente solo tendrá un nivel de funciones anidadas y no dos, como he mostrado aquí.
Solo asegúrese de que cuando cree funciones anidadas, defina estas funciones al comienzo de su función principal antes de que se ejecute cualquier otro código en la función principal.
Finalmente, tenga en cuenta que el miembro "this" se almacena en una variable llamada "_this". Para funciones anidadas, debe devolver "_this" si necesita una referencia a la instancia en el cliente que realiza la llamada. No puede simplemente devolver "esto" en la función anidada porque eso devolverá una referencia a la función y no a la instancia de jQuery. Devolver una referencia de jQuery le permite encadenar métodos intrínsecos de jQuery al regresar.
fuente
Lo obtuve de jQuery Plugin Boilerplate
También descrito en jQuery Plugin Boilerplate, repita
fuente
$('.first-input').data('pluginName').publicMethod('new value').css('color', red);
devuelveCannot read property 'css' of undefined
jsfiddle.net/h8v1k2pL/1return $element
en este ejemplo lo cambiaría aplugin.foo_public_method = function() {/* Your Code */ return $element;}
@Salim gracias por ayudarme ... github.com/AndreaLombardo/BootSideMenu/pull/34Demasiado tarde, pero tal vez pueda ayudar a alguien algún día.
Estaba en la misma situación, creando un complemento jQuery con algunos métodos, y después de leer algunos artículos y algunos neumáticos, creo una plantilla de plugin jQuery ( https://github.com/acanimal/jQuery-Plugin-Boilerplate ).
Además, desarrollé con él un complemento para administrar etiquetas ( https://github.com/acanimal/tagger.js ) y escribí dos publicaciones en el blog explicando paso a paso la creación de un complemento jQuery ( http: // acuriousanimal. com / blog / 2013/01/15 / things-i-learn-creating-a-jquery-plugin-part-i / ).
fuente
Tu puedes hacer:
De esta manera, su objeto de plugins se almacena como valor de datos en su elemento.
fuente
¿Qué pasa con el uso de disparadores? ¿Alguien sabe algún inconveniente al usarlos? El beneficio es que todas las variables internas son accesibles a través de los disparadores, y el código es muy simple.
Ver en jsfiddle .
Ejemplo de uso
Enchufar
fuente
Aquí quiero sugerir pasos para crear un complemento simple con argumentos.
Aquí, hemos agregado un objeto predeterminado llamado
params
y establecemos valores predeterminados de opciones usando laextend
función. Por lo tanto, si pasamos un argumento en blanco, establecerá valores predeterminados;Leer más: Cómo crear el complemento JQuery
fuente
Prueba este:
fuente
Aquí está mi versión básica de esto. Similar a los publicados anteriormente, llamaría como:
-o acceda a la instancia directamente @
plugin_MessagePlugin
MessagePlugin.js
fuente
La siguiente estructura de plugin utiliza el método jQuery
data()
para proporcionar una interfaz pública a los métodos / ajustes internos del plugin (al tiempo que preserva la posibilidad de jQuery):Ahora puede llamar a los métodos internos del complemento para acceder o modificar los datos del complemento o el elemento relevante utilizando esta sintaxis:
Siempre que devuelva el elemento actual (esto) desde el interior de su implementación de
myPublicPluginMethod()
jQuery-chainability se conservará, por lo que funciona lo siguiente:Estos son algunos ejemplos (para obtener detalles, consulte este violín ):
fuente
En realidad, esto se puede hacer que funcione de una manera "agradable" usando
defineProperty
. Donde "agradable" significa sin tener que usar()
para obtener el espacio de nombres del complemento ni tener que pasar el nombre de la función por cadena.Compatibilidad nit:
defineProperty
no funciona en navegadores antiguos como IE8 y versiones inferiores. Advertencia:$.fn.color.blue.apply(foo, args)
no funcionará, debes usarlofoo.color.blue.apply(foo, args)
.Enlace JSFiddle
fuente
De acuerdo con el estándar jquery, puede crear el complemento de la siguiente manera:
¿Cómo llamar a este complemento?
Referencia: enlace
fuente
Creo que esto podría ayudarte ...
En el ejemplo anterior, creé un simple complemento jquery highlight . Compartí un artículo en el que discutí sobre Cómo crear su propio complemento jQuery de Basic a Advance. Creo que deberías echarle un vistazo ... http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/
fuente
A continuación se incluye un pequeño complemento para tener un método de advertencia para la depuración. Mantenga este código en el archivo jquery.debug.js: JS:
HTML:
fuente
Así es como lo hago:
fuente
Lo que hiciste es básicamente extender el objeto jQuery.fn.messagePlugin por un nuevo método. Lo cual es útil pero no en tu caso.
Tienes que hacer es usar esta técnica
Pero puede lograr lo que quiera. Quiero decir que hay una manera de hacer $ ("# mydiv"). MessagePlugin (). SaySomething ("hola"); Mi amigo, él comenzó a escribir sobre lugins y cómo extenderlos con su cadena de funcionalidades aquí está el enlace a su blog
fuente