2009-01-06 14 views
43

Quiero activar el evento presentará de la forma del elemento actual es en un método sé que funciona a veces es:.¿Hay una mejor solución jQuery para this.form.submit() ;?

this.form.submit(); 

Me pregunto si hay una solución mejor, posiblemente usando jQuery, como yo No estoy 100% seguro de que el método funcione en todos los navegadores.

Editar:

La situación que tengo es de la siguiente manera:

<form method="get"> 
    <p><label>Field Label 
     <select onchange="this.form.submit();"> 
      <option value="blah">Blah</option> 
      .... 
     </select></label> 
    </p> 
</form> 

Quiero ser capaz de enviar el formulario de cambio de la <select>.

Lo que estoy buscando es una solución que funciona en cualquier campo de cualquier forma sin conocer la identificación o el nombre en el formulario. $('form:first') y $('form') no funcionarán porque el formulario podría ser el tercero en la página. Además, ya estoy usando jQuery en el sitio, por lo que usar un poco de jQuery no es un gran problema.

Entonces, ¿hay alguna manera de que jQuery recupere el formulario en el que está la entrada/selección/textarea?

+0

El método que publica siempre me ha funcionado. –

+0

Sí, ¿por qué no funciona this.form.submit()? – marcovtwout

Respuesta

101

Creo que lo que busca es algo como esto:

$(field).closest("form").submit(); 

Por ejemplo, para controlar el evento onchange, que la presente:

$(select your fields here).change(function() { 
    $(this).closest("form").submit(); 
}); 

Si, por alguna razón no usan jQuery 1.3 o superior, puede llamar al parents en lugar de closest.

+3

uso más cercano ("formulario") en lugar de los padres ("formulario"). Los padres() obtienen todos los padres del elemento que son formularios, el más cercano() detiene el primer formulario que es padre del elemento – TeKapa

+2

@TeKapa: Gracias. jQuery 1.3 (que agregó la función 'closer') salió una semana después de que respondí la pregunta. –

0

En jQuery puede llamar

$("form:first").trigger("submit") 

No sé si eso es mucho mejor. Creo que form.submit(); es bastante universal.

3

Siempre se puede JQuery-ize su form.submit, pero que sólo puede llamar a lo mismo:

$("form").submit(); // probably able to affect multiple forms (good or bad) 

// or you can address it by ID 
$("#yourFormId").submit(); 

También puede attach funciones a presentar el evento, sino que es un concepto diferente.

+0

La pregunta dice que no quiere hacer esto – Amala

+1

Ciertamente ahora sí. Eso fue en la edición que ocurrió el día después de que se envió mi respuesta. – patridge

24
this.form.submit(); 

Esta es probablemente la mejor opción. Especialmente si aún no está utilizando jQuery en su proyecto, no es necesario agregarlo (o cualquier otra biblioteca JS) solo para este propósito.

1

Su pregunta es un poco confusa en cuanto a que usted no explica lo que quiere decir con "elemento actual".

Si tiene múltiples formularios en una página con todo tipo de elementos de entrada y un botón de tipo "enviar", al presionar "enter" al llenar cualquiera de sus campos se activará el envío de ese formulario. No necesitas ningún Javascript allí.

Pero si tiene varios botones "enviar" en un formulario y ninguna otra entrada (por ejemplo, "editar fila" y/o "eliminar fila" en la tabla), la línea que publicó podría ser la forma de hacerlo .

Otra forma (no se necesita Javascript) podría ser dar diferentes valores a todos sus botones (que son del tipo "enviar"). De esta manera:

<form action="..."> 
    <input type="hidden" name="rowId" value="..."> 
    <button type="submit" name="myaction" value="edit">Edit</button> 
    <button type="submit" name="myaction" value="delete">Delete</button> 
</form> 

Al hacer clic en un botón que contiene sólo la forma se presentará el botón, y sólo el valor del botón de llegar será enviado (a lo largo de otros valores de entrada).

Luego, en el servidor, solo lee el valor de la variable "myaction" y decide qué hacer.

3

similares a Matthew's respuesta, me acaba de encontrar que usted puede hacer lo siguiente:

$(this).closest('form').submit(); 

incorrecto: El problema con el uso de la funcionalidad de los padres es que el campo tiene que ser inmediatamente dentro de la forma de trabajar (no dentro de tds, etiquetas, etc.).

Estoy corregido: padre s (con una s) también funciona. Thxs Paolo por señalar eso.

+0

con el padre ('formulario') lo que dijiste puede ser cierto, pero con parentS ('formulario') debería funcionar incluso si el campo está dentro de un td, etc. –

+0

¿Los padres ('formulario') no devolverían todo formas que son padres de este elemento? Eso potencialmente enviaría un formulario externo que no tenía la intención de enviar todavía. – StriplingWarrior

+0

Acabo de encontrar esto y quiero agregar que no debe tener formularios dentro de formularios. Esto no es válido y no funcionará en IE. Entonces, usar 'parents ('' formulario '')' es perfectamente aceptable, aunque no sé qué tan eficiente es en comparación con 'closer ('' forma '')'. – ClarkeyBoy

0
<form method="get"> 
    <p><label>Field Label 
     <select onchange="this.form.submit();"> 
     <option value="blah">Blah</option> 
      .... 
    </select> 
    </label> 
    </p> 
    **<!-- <input name="submit" type="submit" /> // name="submit_new_name" -->** 
    </form> 

<!-- 

    this.form.submit == this.form.elements['submit']; 

--> 
2

he encontrado que el uso de jQuery la mejor solución es

$(this.form).submit() 

Usando esta declaración jquery plugins (por ejemplo jquery form plugin) funciona correctamente y jquery DOM overhead atravesar se minimiza.

Cuestiones relacionadas