2009-01-06 7 views
26

Me acabo de enterar (por las malas) que cuando tienes un formulario HTML con action="", los navegadores Webkit lo tratan de manera diferente a Firefox e Internet Explorer.Formularios con action = ""

En FF y IE, estas dos etiquetas de formulario son equivalentes:

<form method="post" action=""> 

<form method="post"> 

lo harán tanto enviar el formulario de nuevo a la misma página. Sin embargo, Safari y Chrome enviarán ese primer formulario a la página predeterminada (index.php, o lo que sea) - el segundo formulario funciona igual que FF/IE.

He pirateado rápidamente mi código para que en cualquier lugar donde normalmente se imprima una acción vacía, no agregue ningún atributo de acción.

Esto parece muy complicado y no es la mejor manera de estar haciendo las cosas. ¿Alguien puede sugerir un método mejor? Además, ¿alguien puede informarme sobre por qué Webkit haría tal cosa?

+0

Esto ha sido/fue aparentemente archivado como un error en contra de webkit [aquí] (https://bugs.webkit.org/show_bug.cgi?id=7763) –

Respuesta

6

La mejor manera en mi opinión sería no omitir el atributo de acción (que no validaría) sino especificar la acción real para el formulario. ¿Hay alguna razón por la que no especifiques la acción?

+3

es una forma genérica que está en muchas páginas, algunas de las cuales podría tener una serie de parámetros GET. Me pareció mucho más fácil hacer action = "" que recrear la URL y codificarla correctamente. – nickf

+0

De hecho, tengo un ayudante que analiza los parámetros de la url y los recrea en consecuencia, que utilizo en la mayoría de mis proyectos. ¿Estás usando un patrón de enrutador? realmente ayuda si sus URL tienen una semántica que es predecible y se puede descomponer fácilmente. –

+0

Si nos dice un poco más sobre su entorno, puede haber una respuesta específica que lo haga fácil, por ejemplo, en django, generalmente es suficiente tener 'action =" {{request.path}} "' para obtener el mismo efecto. – SingleNegationElimination

27

lo general el uso

<form method='POST' action='?'> 

Esto significa que la URL actual, pero sin parámetros.

+1

Hago esto, excepto que me atengo a XHTML usando dobles comillas. =] – strager

+12

Puede usar comillas simples y aún tener XHTML válido; no tienes que usar comillas dobles –

+2

Oh, mi mal. Debo estar malinterpretando los estándares que. De todos modos, prefiero las dobles comillas. – strager

2

Siempre he usado (en PHP)

<form method="post" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?>"> 

Para conseguir mis formas de presentar a sí mismos.

+0

Como ya dije: ¡Use 'htmlspecialchars()' y no 'striptags()'! – Gumbo

10

El action attribute is required pero se puede especificar una referencia vacía URI que referes a la corriente URI:

<form method="POST" action=""> 

Editar Ok, en realidad esto es un error presentado de WebKit 528+ (ver Bug 19884) cuando se utiliza un URI vacío con un URI de base especificado utilizando el elemento BASE. En ese caso, WebKit toma el URI base en lugar de resolver el URI vacío desde el URI base.

Pero esto es correct behavior according to RFC 3986:

5,1. Establecimiento de un URI base

El término "relativo" implica que existe un "URI base" contra el cual se aplica la referencia relativa . [...]

El URI base de una referencia se puede establecer en una de cuatro formas, que se describen a continuación por orden de precedencia. Se puede pensar en el orden de precedencia en términos de capas, donde la base más definida URI tiene la precedencia más alta.Esto puede ser visualizado gráficamente como sigue:

.----------------------------------------------------------. 
    | .----------------------------------------------------. | 
    | | .----------------------------------------------. | | 
    | | | .----------------------------------------. | | | 
    | | | | .----------------------------------. | | | | 
    | | | | |  <relative-reference>  | | | | | 
    | | | | `----------------------------------' | | | | 
    | | | | (5.1.1) Base URI embedded in content | | | | 
    | | | `----------------------------------------' | | | 
    | | | (5.1.2) Base URI of the encapsulating entity | | | 
    | | |   (message, representation, or none) | | | 
    | | `----------------------------------------------' | | 
    | | (5.1.3) URI used to retrieve the entity   | | 
    | `----------------------------------------------------' | 
    | (5.1.4) Default Base URI (application-dependent)   | 
    `----------------------------------------------------------' 

En este caso el elemento de BASE con href atributo es un URI de base incrustada en el contenido de. Y base URI incrustado en el contenido tiene una precedencia mayor que URI utilizado para recuperar la entidad. Por lo tanto el comportamiento de WebKit es en realidad el comportamiento esperado de acuerdo con RFC 3986.

Pero in HTML 5 this behavior of an empty URI in form’s action (todavía un borrador) difiere de RFC 3986:

Si acción es la cadena vacía, deja acción sea el document's address.

Nota: Este paso es un willful violation de RFC 3986, que requeriría el procesamiento base de URL aquí. Esta infracción está motivada por un deseo de compatibilidad con el contenido heredado. [RFC3986]

Francamente, un comentario HTML después de esta nota en el código fuente se lee:

<!-- Don't ask me why. But that's what IE does. It even treats 
action="" differently from action=" " or action="#" (the latter 
two resolve to the base URL, the first one resolves to the doc 
URL). And other browsers concur. It is even required, see e.g. 
    http://bugs.webkit.org/show_bug.cgi?id=7763 
    https://bugzilla.mozilla.org/show_bug.cgi?id=297761 
--> 

Así que esto es más bien un error se originó a partir de Internet Explorer que se convirtió en una de-facto estándar.

+0

... excepto que no funciona en los navegadores Webkit, como se menciona en el PO. – nickf

+0

El segundo ejemplo tampoco es HTML válido. – Gumbo

+1

bueno, no, pero en realidad funciona, lo cual es un poco más importante. – nickf