2012-09-14 29 views
6

He leído jquery documentation of plugin authoring y estoy familiarizado con eso. Sin embargo, los ejemplos proporcionados siempre operan en un conjunto de elementos previamente coincidentes. Quiero crear una función que puede hacer ambas cosas:Cómo hacer que una función del complemento jQuery se pueda llamar para uso independiente, que no funcione en una colección

// example usage of my to-be-created plugin function 

// this is the way described in the docs, and I know how to do that 
$("a").myFunction() 

// but I also want to be able to call the function without a collection: 
$.myFunction(); 

Si $.myFunction() se llama sin una colección de operar en, crearía su propia colección de cuáles son los elementos para que coincida - tipo de un proceso de inicialización (pero no necesariamente correr solo una vez). Además, $.myFunction() debe mantener la capacidad de ocultación.

El pseudocódigo de lo que quiero lograr:

// [...] 
function myFunction(): { 
    if (notCalledOnACollection) { 
     // this should run when called via $.myFunction() 
     $elements = $("a.myClass"); 
    } 
    else { 
     $elements = $(this); 
    } 
    return $elements.each (function() { 
     // do sth. here 
    }); 
} 

Realmente me gustaría mantener todas las funciones de aplicación/funcionalidad dentro de una única definición de la función, y no tener dos funciones llamadas por separado o dos por igual nombre funciones en dos lugares separados dentro del objeto jQuery.

Y por supuesto que podría añadir un parámetro myFunction (do_init) que indica qué rama de la declaración if para ejecutar, pero eso sería el desorden de mi lista de argumentos (Quiero utilizar este enfoque para múltiples plugins, y no habrá argumentes a myFunction() que Simplemente lo dejé aquí por simplicidad).

¿Alguna buena sugerencia?

Respuesta

8

Simplemente añadiendo otra referencia en el definiton plugin, puede utilizar fácilmente el código del plugin estándar:

(function($) { 
    $.myPlugin = $.fn.myPlugin = function(myPluginArguments) { 
     if(this.jquery) 
      //"this" is a jquery collection, do jquery stuff with it 
     } else { 
      //"this" is not a jquery collection 
     } 
    }; 

    $.fn.myPlugin.otherFunc = function() { 
    }; 
})(jQuery); 

La única diferencia aquí es la parte $.myPlugin = que le permite llamar directamente su plugin sin correr el selector de jQuery función. Si decide que necesita otras funciones o propiedades, puede crearlas como propiedades de su complemento.

Uso:

//using a selector (arguments optional) 
$(".someClass").myPlugin(); 

//using the options variable - or whatever your arguments are 
$.myPlugin({id: "someId"}); 

//accessing your other functions/properties 
$.myPlugin.otherFunc(); 
+0

tengo serios problemas con su solución. He replicado su enfoque en jsfiddle: http://jsfiddle.net/pnpbU/ Pero una vez que ejecuto '$ .myPlugin()', todos los navegadores probados consumen 100% de CPU y se quedan atascados (probados con FF en Linux y Windows , Safari en Mac). – Dyna

+0

No veo ese problema en mi máquina. Y estoy en un dinosaurio en este momento. Y además, jsfiddle no debe usarse para pruebas de rendimiento, tienen un montón de extras cargados. También probé a nivel local y tampoco vi el problema allí. Realmente dudo que tu visión tenga algo que ver con este código. – Donamite

+0

¿Descomentó la línea en la parte js de jsfiddle? De lo contrario, no se ejecutará! Actualmente estoy en la universidad y tengo acceso a un montón de computadoras y puedo reproducir el consumo de 100% de la CPU en 3 máquinas físicamente diferentes. Usar http://jsfiddle.net/pnpbU (sin comentar la última línea) y presionar ejecutar bloqueará/terminará el script en Fedora 17: Firefox 14.0.1, Chrome 22; Windows 7: Firefox 14, IE9; OS X Lion: Safari 5, Firefox 14. Por lo tanto, es * definitivamente * reproducible. Esto no tiene nada que ver con jsfiddle, copiar esa secuencia de comandos junto con jQuery 1.8.0 y ejecutar muestra el mismo efecto. – Dyna

Cuestiones relacionadas