2010-04-20 6 views
67

Algunos de los tutoriales y ejemplos que he visto para el desarrollo de plugins jQuery tenderá a volver¿Por qué devolver this.each (function()) en jQuery plugins?

this.each(function() { 
    //Plugin code here 
}); 

al final de la función que crea una instancia del plug-in, pero yo todavía no han visto ningún razonamiento detrás de él, que sólo parece ser un estándar que todos sigan. ¿Alguien puede iluminarme en cuanto al razonamiento detrás de esta práctica?

Editar: Para aclarar mi pregunta no era sobre por qué devolver esto, sino más bien por qué el complemento debería devolver this.each.

+0

Eso ES extraño. Parece que devolver 'this' sería una idea mucho mejor ... –

+0

@Walt W - Estoy de acuerdo. Entiendo por qué deberíamos devolver esto, porque eso se mantiene con la idea de una interfaz fluida. Pero la parte que no entiendo es cada llamada. –

+0

Solo para aclarar, ¿las funciones están en blanco a medida que las escribió? ¿O hay código allí? –

Respuesta

70

Al filtrar elementos con un selector ($('.myclass')), puede coincidir con más de un solo elemento.
Con each, itera sobre todos los elementos coincidentes y su código se aplica a todos ellos.

+1

¡Por supuesto! Gracias, supongo que lo di por sentado cada vez que he usado complementos previamente. –

+12

Si bien esto es absolutamente cierto, la verdadera razón para 'devolver' es permitir el encadenamiento ... – Leo

+3

@Mef: Bueno, pensé que esto es claro y que se trata más sobre por qué usar' each'. –

7

Cuando escribe un complemento está extendiendo el objeto jQuery, y como el objeto jQuery es una secuencia, devuelve this.each(function() { }); para que su complemento se ejecute para cada elemento de la secuencia.

+1

pero en realidad solo está devolviendo "uno" "esto" ¿verdad? cada parte está separada, ¿no? – Hans

+3

@Marcel: sí, de hecho puede llamar 'each' y luego devolver' this', como dos instrucciones separadas. Funciona porque 'each' también devuelve' this'. –

21

jQuery soportes "métodos encadenables", lo que significa que más funciones jQuery deben volver this. .each() devuelve this, y si quiere que $('selector').yourPlugin().css(...) funcione, debe return this.

+6

Esta es la respuesta correcta. La razón por la que regresas es para permitir la chainable. – Undefined

4

En resumen, le permite aprovechar el encadenamiento, ya que devuelve todo lo que se ha hecho hasta ahora para que el siguiente .anyMethod() actúe sobre los elementos modificados/modificados.



Además, echar un vistazo a estos enlaces que le dará una gran cantidad de información sobre el desarrollo plugin de jQuery.

http://www.webresourcesdepot.com/jquery-plugin-development-10-tutorials-to-get-started/
http://www.learningjquery.com/2007/10/a-plugin-development-pattern
http://snook.ca/archives/javascript/jquery_plugin

Y aquí se tiene una aplicación basada en web agradable que le ayuda a poner en marcha su plugins jQuery. http://starter.pixelgraphics.us/

7

me dejó mostrarle dos piezas "equivalentes" de código que podría aclarar su pregunta:

con jQuery "cada" función:

(function($) { 
    $.fn.mangle = function(options) { 
     return this.each(function() { 
      $(this).append(' - ' + $(this).data('x')); 
     }); 
    }; 
})(jQuery); 

Sin jQuery "cada" función :

(function($) { 
    $.fn.mangle = function(options) { 
     var objs = this; 
     for (var i=0; i<objs.length; i++) { 
      var obj = objs[i]; 
      $(obj).append(' - ' + $(obj).data('x')); 
     }; 
     return this; 
    }; 
})(jQuery); 

S o, básicamente, each función se utiliza para aplicar un poco de código a todos los elementos contenidos en this objeto (como this generalmente se refiere a un grupo de elementos devueltos por un selector de jQuery) y devolver la referencia a this (como each función siempre devuelve que la referencia: para permitir el encadenamiento calls-)

Como nota al margen: El segundo enfoque (- for loop-) es más rápido (en particular en los navegadores antiguos) que el ex uno (- each Función-).

Cuestiones relacionadas