¿Cómo obtener la forma contenedora de una entrada?


106

Necesito obtener una referencia al formulario principal de una ENTRADA cuando solo tengo una referencia a esa ENTRADA. ¿Es esto posible con JavaScript? Utilice jQuery si lo desea.

function doSomething(element) {
    //element is input object
    //how to get reference to form?
}

Esto no funciona:

var form = $(element).parents('form:first');

alert($(form).attr("name"));

Respuestas:


185

Los elementos DOM nativos que son entradas también tienen un formatributo que apunta al formulario al que pertenecen:

var form = element.form;
alert($(form).attr('name'));

Según w3schools , la .formpropiedad de los campos de entrada es compatible con IE 4.0+, Firefox 1.0+, Opera 9.0+, que son incluso más navegadores que jQuery garantiza, por lo que debe atenerse a esto.

Si este fuera un tipo diferente de elemento (no un <input>), podría encontrar el padre más cercano con closest:

var $form = $(element).closest('form');
alert($form.attr('name'));

Además, vea este enlace MDN en la formpropiedad de HTMLInputElement:


Muy bien, esto funciona ... Sobre el atributo de formulario. Lo acabo de probar y eso también funciona. ¿Pero esto no es compatible con todos los navegadores, estás diciendo?
Ropstah

Estoy bastante seguro de que lo es. No estoy 100% seguro, así que no quiero prometer nada. Lo estoy investigando ahora mismo ...
Paolo Bergantino

5
Use element.form: funcionará en más navegadores que jQuery. También es una referencia de propiedad, por lo que será alrededor de mil veces más eficiente que caminar por el árbol DOM con más cercano ().
NickFitz

1
Estoy de acuerdo. Como dije, inicialmente no estaba seguro de si la propiedad del formulario se implementó ampliamente en todos los navegadores comunes. Edité mi respuesta para enumerar esto de manera más explícita como la mejor opción, mientras que lo dejo más cercano como un tidbit si se trata de un tipo de elemento diferente.
Paolo Bergantino

Parece funcionar también con otros tipos de entrada como select. Bueno saber.
Falk

42

Cada entrada tiene una formpropiedad que apunta a la forma a la que pertenece la entrada, así que simplemente:

function doSomething(element) {
  var form = element.form;
}

4

Uso un poco de jQuery y javascript de estilo antiguo, menos código

$($(this)[0].form) 

Esta es una referencia completa al formulario que contiene el elemento.


3
Básicamente estás diciendo "haz de esto un objeto jQuery y luego haz que no sea un objeto jQuery".
Isherwood

1
caramba, ¿por qué no simplemente hacer $(this.form)?
Andre Figueiredo

3

Usando jQuery :

function doSomething(element) {
    var form = $(element).closest("form").get().
    //do something with the form.
}

2

Si usa jQuery y tiene un identificador para cualquier elemento de formulario, debe obtener (0) el elemento antes de usar .form

var my_form = $('input[name=first_name]').get(0).form;

2
function doSomething(element) {
  var form = element.form;
}

y en el html, debe encontrar ese elemento y agregar el atributo "formulario" para conectarse a ese formulario, consulte http://www.w3schools.com/tags/att_input_form.asp pero este atributo de formulario no admite IE , por ejemplo, debe pasar la identificación del formulario directamente.


2

Necesitaba usar en element.attr('form')lugar de element.form.

Uso Firefox en Fedora 12.


0

simplemente como:

alert( $(this.form).attr('name') );

0

Y uno más ...

var _e = $(e.target); // e being the event triggered
var element = _e.parent(); // the element the event was triggered on
console.log("_E " + element.context); // [object HTMLInputElement]
console.log("_E FORM " + element.context.form); // [object HTMLFormElement]
console.log("_E FORM " + element.context.form.id); // form id

0

Este ejemplo de una función de Javascript es llamado por un detector de eventos para identificar el formulario

function submitUpdate(event) {
    trigger_field = document.getElementById(event.target.id);
    trigger_form = trigger_field.form;

-2

¿Funcionaría esto? (dejar la acción en blanco también envía el formulario a sí mismo, ¿verdad?)

<form action="">
<select name="memberid" onchange="this.form.submit();">
<option value="1">member 1</option>
<option value="2">member 2</option>
</select>

"this" sería el elemento de selección, .form sería su formulario principal. ¿Correcto?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.