2010-12-08 17 views
8

Estoy tratando de encadenar una función anónima en jQuery pero no está funcionando. Aparece un error "Error: el filtro XML se aplica al valor que no es XML ...". ¿Cuál es la sintaxis adecuada o hay una función de efecto que puedo usar que no hace nada visualmente y que envuelve mi función?Cómo encadenar una función anónima en jQuery?

Mi ejemplo: $item.appendTo($list).(function() {.....}());

+0

¿Se puede elaborar en lo que estás tratando de lograr? Esto no tiene sentido para mí en absoluto.¿Estás tratando de invocar una función tal que 'this' está establecido en' $ item'? – meagar

Respuesta

7

El encadenamiento funciona devolviendo el objeto jQuery original como resultado de la invocación de la función encadenable dada. Hipotéticamente, para encadenar sus funciones anónimas, debe 'devolver' el objeto jQuery original.

Sin embargo, su función tiene que ser invocable desde el contexto del objeto jQuery. Por ejemplo, existe la función

$item.appendTo 

Sin embargo, no hay ninguna función en el objeto jQuery que es accesible por:

$item.(function(){ }) 

Piense en ello como esto. Digamos que usted tiene el objeto siguiente:

var obj = { foo: function(){ console.log(1); } }; 

La declaración 'foo' es accesible como una propiedad/declaración sobre obj. Pero, ¿cuál es exactamente la declaración a la que hace referencia con una función anónima?

obj.(function(){ }) 

La única forma en que podría dar a su función anónima un contexto de ejecución del objeto jQuery, sería hacer una 'llamada' en él

(function(){ }).call($item, args); 

Si usted quería cadena de esto, se podría hacerlo teóricamente por:

(function(){ return this; }).call($item, args).appendTo($other); 

Pero no estoy seguro de qué ganaría. Su mejor apuesta es simplemente hacer:

$item.appendTo($list); 
(function($obj){ })($item); 

O, si usted está comenzando con un selector:

var $item = $('#someID').appendTo($list); 
(function($obj){ })($item); 

Aunque, en este punto funciones anónimas no son tan útiles, por lo que simplemente :

var someFunc = function($obj){ }; 
$item.appendTo($list); 
someFunc($item); 
+0

Algo así como: $ item.appendTo ($ list). (Function ($) {/ * haz tus cosas */return $;}) (jQuery); – rcravens

+0

es necesario devolver el objeto jQuery si desea continuar el encadenamiento después de la función anónima. Si es el último (* y no quiere que se devuelva nada para un uso posterior *), no lo necesita. –

+0

@rcravens eso es lo que pensé al principio también, pero no se puede llamar nada en $ item que no exista como función. Ver actualización arriba. – Matt

0

¿No debería ser:

$item.appendTo($list).(function() {.....})(); 

totalmente olvidó mencionar devolver $;

5

se puede utilizar el método .each

$item.appendTo($list).each(function() {.....}); 

Como alternativa, puede extender el objeto jquery con sus propias funciones (jQuery.fn.extend()).

$.fn.extend({ 
    myOwnFunc: function(){ 
     /*do whatever*/ 
     return this; // to allow for further chaining. 
    } 
}); 

y ahora se puede llamar $item.appendTo($list).myOwnFunc()

Cuestiones relacionadas