Hoy he creado un pequeño cuestionario sobre formularios HTML.
ref: https://gist.github.com/ahoward/98591ebc9113bea1cf02
<!--
bifurca esto. no uses internet. tómate < 10 minutos para encontrar al menos 10
errores distintos en este formulario. envía tu respuesta en el campo de comentarios de
tu bifurcación y envíame por correo electrónico (ara[at]dojo4.com) la url.
-->
<form method='DELETE' ACTION='./' enctype="multipart/file-upload">
<fieldset>
<legend> etiquetas </legend>
<input type='text' name='etiquetas' value='foo'/>
<input type='text' name='etiquetas' value='bar'/>
</fieldset>
<label for='foo'>Foo: </label> <input name='foo'> <input name='foo'>
<label>
Bar: <input name='bar'>
</label>
<input name='email' readonly/>
<input name='password' disabled=disabled/>
<input type='file' name='file' value='.bashrc'/>
<fieldset>
<legend>Sexo</legend>
<input type="radio" name="sexo">
<option value='hombre'>Hombre</option>
<option value='mujer'/>
</input>
<fieldset>
<legend>Transporte</legend>
<input type="checkbox" name="vehículo" value="Bicicleta">Tengo una bicicleta<br>
<input type="checkbox" name="vehículo" value="Coche">Tengo un coche
</fieldset>
</fieldset>
<select name='habilidades-desarrollo-web'>
<option value='A'>
<option value='B'>
<option value='C'>
<option value='D'>
<option value='F'>
</select>
<hr>
<button type='submit'>
</form>
El objetivo de hacer que la gente escanee este formulario HTML completamente roto era simplemente ver la línea de pensamiento de las personas con esto: la columna vertebral de las interfaces HTML.
A continuación se presentan algunas respuestas de ejemplo, agrupadas aproximadamente por categoría, y comentarios sobre cada una de ellas.
doctype estropeado
- Sin doctype. Dificulta determinar qué versión de HTML es, lo que debería llevar a respuestas interesantes…
- Mezcla etiquetas vacías de estilo xhtml con etiquetas HTML.
Seguramente, la mayoría de la gente pasó por alto que muchos errores dependían de la declaración del doctype. qué estilo de etiquetas puedes usar depende completamente del doctype.
método=delete
- línea 1: DELETE no es una acción soportada en formularios HTML:
- método=delete no se soporta directamente en la mayoría/todos? de los navegadores.
- los formularios no soportan delete en navegadores antiguos
- Método delete
- form método='DELETE' – eso no está permitido
aunque pensamos en verbos http con apis de cliente, incluyendo javascript. para la mayoría de los navegadores obtienes GET y POST. esto es importante si has estado considerando una api basada en xhtml.
enctype=basura
- enctype="multipart/form-data" no enctype="multipart/file-upload”
- enc-type="multipart/file-upload no tiene sentido si nuestra intención es ELIMINAR
los errores de enctype siempre desperdician un día. equivócate y desperdiciarás el día publicando el nombre de tu archivo como una cadena, en lugar del contenido del archivo codificado. también es importante señalar que el enctype simplemente dicta cómo se codifica el formulario y es completamente ortogonal al verbo http utilizado.
input=foo && input=foo
- etiquetas de entrada de texto en el primer fieldset tienen el nombre
- etiquetas duplicadas “tags”. O dos etiquetas con el mismo nombre de nuevo
- 2 campos de texto llamados “tags” solo se usará el último.
- Dos entradas con el mismo nombre 'tags'. La segunda sobrescribiría el valor de la primera.
- Dos entradas con el nombre 'foo' (no autocerradas)
- entradas de texto con el mismo nombre sobrescribirían respecto a: entradas con nombre etiquetas
- asignaciones duplicadas a input name='etiquetas'
- asignaciones duplicadas a input name='vehículo'
Muchas ideas erróneas sobre esto. es totalmente legítimo publicar el mismo parámetro > 1 veces en un formulario. la especificación lo soporta e incluso el antiguo soporte cgi soporta la noción de publicar múltiples valores bajo la misma clave. es simplemente convención que muchos controladores vuelcan estos en un hash donde 'el último gana’
puedes probarlo fácilmente tu mismo. publica esto desde un formulario
<input name='respuesta' value='40'>
<input name='respuesta' value='2'>
y verás lo siguiente en la consola del navegador
<img
style =’max-height:420px;’ src=’http://cl.ly/image/3I2Q2v0D1B1G/Screen%20Shot%202013-06-17%20at%204.09.23%20PM.png’
si manejas la publicación del formulario de la siguiente manera
def formulario
return if request.get?
parsed = Parser.new(env).parse
render :json => parsed.as_json, :layout => true
end
# hackea el parser de rack para mostrar que http SÍ publica múltiples valores
# y que, si queremos, podríamos acumularlos
#
class Parser < Rack::Multipart::Parser
def setup_parse
super
ensure
@params = KeyList.new
end
class KeyList
def initialize(*args, &block)
@params = {}
end
def [](key)
@params[key]
end
def []=(key, value)
(@params[key] ||= []).push(value)
end
def key?(key)
@params.key?(key)
end
def to_params_hash()
self
end
end
end
luego obtendrás una respuesta que se ve así
{"params":{"respuesta":["40","2"]}}
Resumen;
tu stack web puede eliminar múltiples valores al cargar un hash, pero la biblioteca cgi.rb de ruby y http en general no lo hacen. esto se aplica a entradas, checkboxen, etc - cualquier cosa con nombre puede pasar múltiples valores.
en particular, la biblioteca cgi.rb de ruby no limita la publicación de múltiples valores bajo una clave
mientras que rails sí
las etiquetas son blargh
- No for en la etiqueta ‘Bar:’.
- etiqueta no vinculada: (etiqueta para qué?)
las etiquetas sin un for son totalmente legítimas. cuando envuelves una entrada con una etiqueta, el 'for' se implica como la entrada contenida. estas son equivalentes
<label for='foo'>Foo</label> <input name='foo'>
<label for='foo'>Foo <input name='foo'></label>
con el primero siendo mucho más simple de manejar en js ( $label.find(‘input’) )
$label.find('input')
vs.
var name = $label.attr('for');
$input = $('name[' + name ']');
readonly y disabled son difíciles
- entrada readonly sin valor es inútil
- disabled debería tener comillas alrededor (también una mala mezcla de comillas simples y dobles a lo largo)
- faltan comillas alrededor del atributo disabled en la declaración incorrecta de entrada de contraseña
- disabled=disabled debería ser disabled
- faltan comillas alrededor del atributo disabled
readonly y disabled son ambos atributos booleanos y, como tales, tienen tanto permutaciones con comillas/sin comillas como con valor/sin valor
todos estos están bien
<input readonly>
<input readonly=readonly>
<input readonly="readonly">
aunque ser consistente y usar comillas es más ampliamente manejado en editores de texto
refs:
- http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#the-readonly-attribute
- http://www.whatwg.org/specs/web-apps/current-work/multipage/common-microsyntaxes.html#boolean-attribute
form[action]
- action="./" parece una mala práctica para mí
- la acción del formulario no es válida como descriptor de ruta de archivo unix – para enviar a la url actual, elimina la acción por completo ya que esa es la