2010-02-08 9 views
7

Si un usuario crea un formulario sin un atributo de método, parece que la mayoría de los navegadores manejarán esto en el momento del envío del formulario. Por lo tanto, al inspeccionar el elemento del formulario después de que el DOM esté listo, puede ver que no hay un atributo "método" del objeto del elemento de formulario.El método de formulario predeterminado IE7 es "GET". ¿Cómo puedo saber si el usuario ha ingresado o está predeterminado?

IE7, sin embargo, aparentemente establece un valor de método predeterminado de "GET" en todos los formularios sin un valor de método. No quiero discutir si GET o POST es el valor predeterminado más razonable, solo quiero encontrar una manera de hacer que POST sea el método de formulario predeterminado en todos los navegadores.

Mi problema es que no puedo decir si el usuario ingresó un valor "GET" para un método de formulario, o si IE lo inyectó como valor predeterminado. Si no hay un atributo de método del formulario, es obvio que los usuarios no especificaron uno, por lo que puedo establecerlo por defecto en POST. Pero si veo un valor GET para un método de formulario, no puedo decir si el usuario lo especificó, o si se dejó en negro e IE7 configuró GET cuando analizó el HTML.

¿Alguien tiene alguna idea?

+0

Me cuesta creer que IE7 configure el método predeterminado para GET ... Pero entonces, supongo que lo ha probado. –

+0

@Pekka: Sí, 'formElement.getAttribute (" método ")' devolverá 'GET' incluso si no ha sido configurado por el HTML. Buenas noticias es que outerHTML no lo devuelve. –

+1

¿Qué ... qué es lo que estás tratando de lograr aquí? Sospecho muy fuertemente que desde el lado del servidor de la transacción HTTP no habrá forma de saberlo. pero ¿Por qué querrías? – Pointy

Respuesta

16

comportamiento de IE es correcta (*) De acuerdo con DTD:

method  (GET|POST)  GET  -- HTTP method used to submit the form-- 

o, en el XHTML DTD:

method  (get|post)  "get" 

eso significa que si se omite el atributo method, no solo el formulario se envía como GET por defecto, sino que el DOM debería contener un Attr nodo para method con el valor predeterminado de DTD GET.

(*: bueno, algo así como. IE está utilizando el XHTML en minúsculas por defecto en un documento HTML donde debería ser mayúsculas. No es que realmente importe ya que el atributo no distingue entre mayúsculas y minúsculas en HTML de todos modos. Y hey! Es IE obteniendo el estándar más correcto que todos los otros navegadores. ¡Es un milagro!)

Entonces, ¿cómo se dice que el nodo Attr se colocó allí debido a la falla del atributo DTD y no porque estaba en el ¿fuente? Con el Nivel 1 del DOM Core specified bandera:

var form= document.getElementById('myform'); 
var attr= form.getAttributeNode('method'); 
var isomitted= attr===null || !attr.specified; 
+0

+1, una respuesta mejor que la mía y aprendí algo. 'attr' nunca es' nulo' en la línea final (al menos para el atributo 'method') en IE así que probablemente solo puedas vivir con'! attr.specified' –

+2

Sí, la idea es acomodar a los otros navegadores con eso prueba. – bobince

1

Esto no parece estar en violación de la HTML form spec, que establece:

Este atributo especifica qué HTTP método será utilizado para enviar el conjunto de datos de forma . Los valores posibles (que no distinguen entre mayúsculas y minúsculas) son "get" (por defecto) y "post". Vea la sección en forma presentación de información de uso

+0

Cambié su cita de formato de código a blockquote, espero que no le moleste, pero se ve un poco raro con varias palabras en diferentes colores :-) –

0

(? ¿Cómo respondo a una respuesta específica) (en respuesta a bobice :) comportamiento

de IE es correcta!

Si leo las especificaciones pertinentes correctamente, todos estos son el caso en las implementaciones conformes (que IE no lo es):

form.method == "get" /* IETF and W3C HTMLs and XHTMLs */ || form.method == "GET" /* HTML5* */ 
form.hasAttribute ("method") == false 
form.getAttribute ("method") == "" 
form.getAttributeNode ("method") == null 

En Chrome "beta 8.0.552.28" en Linux, lo entiendo (también no es correcto)

var form = document.createElement ("form") 
undefined 
form.method == "get" || form.method == "GET" 
false /* actual value is "" */ 
form.hasAttribute ("method") == false 
true 
form.getAttribute ("method") == "" 
false /* actual value is null */ 
form.getAttributeNode ("method") == null 
true 
  • En HTML5, método es una enumerado atribuir igual a uno de GET, POST, PUT, DELETE. form.method debe "reflejar" el atributo del método, que en el caso de un atributo enumerado significa el valor especificado si coincide con uno de los valores válidos o el primer valor válido. (Puedo estar leyendo esto un poco mal, pero esa es mi interpretación.)
Cuestiones relacionadas