Búsqueda de sitios web

javascript - Cómo hacer que una función de plugin de jQuery sea invocable para su uso independiente, que no opere sobre una colección


Leí la documentación de jQuery sobre la creación de plugins y estoy familiarizado con eso. Sin embargo, los ejemplos dados siempre operan en un conjunto de elementos previamente seleccionados. Quiero crear una función que pueda hacer ambas cosas:

// 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 sobre la cual operar, crearía su propia colección de qué elementos coincidir - una especie de proceso de inicialización (pero no necesariamente ejecutado solo una vez). Además, $.myFunction() debería mantener la cadena de llamadas.

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 toda la implementación/funcionalidad de las funciones dentro de una única definición de función, y no tener dos funciones con nombres separados o dos funciones con el mismo nombre en dos lugares distintos dentro del objeto jQuery.

Y, por supuesto, podría agregar un parámetro myFunction (do_init) que indique qué rama de la declaración if ejecutar, pero eso llenaría mi lista de argumentos (quiero usar ese enfoque para múltiples complementos, y habrá argumentos para myFunction() que simplemente omití aquí para simplificar).

¿Alguna buena sugerencia?

Respuesta #1

Simplemente agregando otra referencia en la definición del complemento, puedes usar fácilmente el código estándar del complemento:

(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 te permite llamar directamente a tu plugin sin usar la función selector de jQuery. Si decides que necesitas otras funciones o propiedades, puedes crearlas como propiedades de tu plugin.

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();