2011-06-08 6 views
8
$('form').each(function(){ 
    var form = this; 
    $('a', this).click(function(){ form.submit(); }); 
}); 

¿Hay alguna manera de obtener el elemento padre (this) en el interior de esa función de clic, sin necesidad de utilizar una variable intermedia? Estaba pensando que tal vez haya una palabra clave que no conozco que te permita hacerlo.jQuery - padres "este"

En la función $ .ajax hay un parámetro context que le permite hacer algo como esto.

+1

¿No es solo 'formulario'? – Femi

+0

¿No podría usar '$ ('a', this) .click (function() {$ (this) .closest ('form'). Submit();});' O ... ¿deseaba más? respuesta concisa/específica? –

Respuesta

7

No, lo has hecho de la mejor manera. Convención sugiere el uso que:

var that = this; 
$('a', this).click(function(){ that.submit(); }); 
+0

O uno mismo. var self = this; –

+1

Personalmente, no me gusta esa convención. Usar un nombre descriptivo (como 'form') es muy superior cuando se trata de leer el código. – lonesomeday

+0

Esto no hace la pregunta: '" ... sin usar una variable intermedia "' – Matt

2

desde a es un hijo de form, puede utilizar closest:

$('a', this).click(function(){ $(this).closest('form').submit(); }); 

Otra opción es proxy:

$('a', this).click($.proxy(function(){ this.submit(); }, this)); 
+0

El único problema con el uso de '$ .proxy' es que pierdes la capacidad de hacer referencia a la referencia' this' habitual dentro del controlador de eventos. – Josh

+0

@ user349433 - verdadero, pero también podría pasar un parámetro de evento y verificar el 'objetivo'. De cualquier manera prefiero 'más cercano' en este escenario – Matt

+0

Creo que es un error ir al DOM por esto. Aunque sería fácil de depurar, se romperá si la jerarquía cambia y está gravando el guión al atravesar nuevamente a un elemento que ya ha seleccionado. Es mejor permanecer en la abstracción. – glortho

1

Usted debe ser capaz de hacer referencia a él con el padre de jquery (o padres según cómo esté anidada la etiqueta a) selector

Así que algo como esto debería funcionar:

$('form').each(function(){ 
    $('a', $(this)).click(function(){ $(this).parent('form').submit(); }); 
}); 
2

Claro - utilizar un cierre.

$('form').each(function() { 
    $('a', this).click((function(x) { return function() { x.submit(); })(this)); 
}); 

Si usted tiene una función curry (similar a la de prototipo, no está seguro de si uno está construido en jQuery), puede simplificar la línea media un poco:

$('a', this).click(curry(function(x) { x.submit(); }, this)); 
2

En primer lugar, su el ejemplo es correcto, y en segundo lugar, es cómo la mayoría de las personas lo haría. No hay palabra clave, solo se invierte la dirección y se cruza el DOM para el padre más probable (lo cual es una tontería ya que ya lo has encontrado, ¿no?). Siendo ese el caso, recomendaría una variable intermedia, incluso si otros respondedores han mostrado correctamente cómo usar closest. (También, que se basa en algo así como un detalle técnico, que una <form> dentro de un <form> es HTML válido. No hay garantía para cosas como un <div> que no cruce por cualquier niño <div> s en busca de la próxima <a>.)

En jQuery que ver un montón de cosas como esta:

$("#parent").something(function() { 

    var _this = this; 
// var self = this; 
// var that = this; 
// var someMoreMeaningfulName = this; 

    $("#child", this).somethingElse(function() { 
     $(_this).somethingEvenElser(); 
     ... 
    }); 
}); 

no es la cosa más bonita de leer, pero el patrón ocurre con suficiente frecuencia que es fácilmente reconocible. De alguna manera recomiendo lo que estás haciendo (var form) en lugar de cosas como _this (guión bajo puede implicar variables privadas), self (en realidad no lo es), etc.

Cuestiones relacionadas