2010-04-06 20 views
23

Me gustaría tener un botón de enviar que presente un valor diferente al que se muestra en el botón. Con <input type="submit"> parece que no puede hacer esto. Sin embargo, con <button type="submit">, estos pueden ser dos valores diferentes. La pregunta es, ¿funcionará en todos los navegadores?<button type = "submit"> compatibilidad?

Tratando este código de prueba aquí:

<form method="get" action=""> 
    <input type="text" name="txt"/> 
    <button type="submit" name="btn" value="val">text</button> 
</form> 

En FF 3.6 se actualiza mi barra de direcciones con ambos valores apropiadamente (y me responde presionando entrar en el cuadro de texto). En IE 8, también acepta presionar enter, muestra el valor del texto en la barra de direcciones, pero no muestra el valor del botón como un parametro GET para nada ... ¿significa eso que no lo está enviando?


No puedo usar entradas ocultas porque necesito determinar en qué botón se hace clic sin JS.


Prueba 2:

<form method="get" action=""> 
    <input type="text" name="txt"/> 
    <button type="submit" name="submit1" value="submit1">submit</button> 
    <input type="submit" name="submit2" value="submit2"/> 
    <input type="submit" name="submit3" value="submit3"/> 
</form> 

En IE8, oprimir la tecla Enter no presentar ninguno de los botones, pero al hacer clic Submit1 se enviar un valor. Enviará "enviar", no "enviar1", lo cual es inconsistente con FF. Sin embargo, al enviar el formulario solo se envía el valor de un botón en ambos navegadores, lo que significa que podría verificar en el que se hizo clic en el botón comprobando si en su lugar había GET['submitX']. Chrome tiene un comportamiento ligeramente diferente al presionar enter (submits button2). Opera parece consistente con FF ... pero los 4 navegadores solo presentan un botón. No tengo ninguna versión anterior de los navegadores instalados ... ¿Alguien sabe si funciona en versiones anteriores, especialmente IE6?

+0

¿No quieres usar '' en lugar? – vooD

+0

@vooD: No ... la idea es que quiero tener múltiples botones de envío en la página, y los necesito para hacer cosas diferentes, sin el uso de JavaScript. – mpen

+1

para probar en IE5 e IE6, y si está ejecutando Windows, siempre puede usar IE Tester @ http://www.my-debugbar.com/wiki/IETester/HomePage – balexandre

Respuesta

11

Publicación antigua pero creo que hay una solución que se ha perdido aquí. El button[type=submit] siempre ha tenido problemas de comportamiento incoherente, especialmente con IE antiguos, y desde las pruebas de @Mark parece que todavía tenemos problemas.

En su lugar, puede usar dos valores diferentes para el atributo name del input[type=submit] y analizar estos servidores para obtener la acción correcta. Por ejemplo, se puede hacer:

<form method="get" action=""> 
    <input type="text" name="txt"/> 
    <input type="submit" name="action[do_something]" value="Do Something Cool"/> 
    <input type="submit" name="action[do_another]" value="Do Something Dangerous"/> 
</form> 

Sólo el éxito (clic o por defecto) par nombre-valor se presentó así, por ejemplo, en PHP que puede hacer fácilmente algo como:

<?php 
if (isset($_GET['action']['do_something'])) { 
    // do something 
} else { 
    // do another thing 
} 
?> 

Nota del la acción predeterminada siempre será la primera que aparece en la fuente.

+0

He tomado este enfoque exacto en el pasado; Creo que estaba buscando una solución más limpia/semántica, pero al menos esto funciona de manera confiable. – mpen

+0

¿Sabe por qué IE se aplica el problema del botón [type = submit]? – Zubzob

+1

@Zubzob Parece que se aplica a IE8 en modo 'Quirks'. Entonces, si está en IE8 y no especifica el doctype como (digamos) HTML5, publicará el texto del botón. Cambie al modo estándar y publicará el atributo 'valor'. Algunas pruebas rápidas con IE6 e IE7 + WinXP mostraban el texto del botón que se enviaba, independientemente de si se usaba un tipo de documento moderno. – contrebis

1

Use campos ocultos, son la mejor manera de hacerlo.

<input type="hidden" value="any value you want to enter" /> 
+0

¿Cómo me da eso 2 valores diferentes dependiendo de qué botón en el que hice clic? Sé que no hice explícita mi intención en la Q, pero eso es lo que busco. – mpen

+2

agregue más botones pero cambie solo los nombres – Saleh

+0

Ahora parece que podría ser una solución real. No es ideal, pero viable. – mpen

10

Aquí hay una alternativa si no está seguro sobre el uso de una etiqueta de botón.

<form method="get" action=""> 
    <input type="text" name="txt" /> 
    <input type="hidden" name="myinput" value="myvalue" /> 
    <input type="submit" name="submit" /> 
</form> 

Esto será más consistente que una etiqueta de botón como como algunos navegadores realidad someten el texto dentro de las etiquetas de botón en lugar de su atributo de valor. Por ejemplo

<button name="mybutton" type="submit" value="one">Two</button> 

En algunos navegadores, que tendría "un" presentó, en otros, "Dos".

Si desea actuar de forma condicional dependiendo del botón pulsado en particular, tendría que hacerlo en base al texto de la entrada ...

En este ejemplo, el texto de la pantalla ("Botón 1" o "Botón 2") se publicarán de nuevo.

Firefox: "? Txt = & submit = Botón + 1" IE: "? Txt = & submit = Botón + 1" Safari: "? Txt = & submit = Botón + 1"

Y pronto.En general, se acepta que sea posible dar dos elementos de formulario del mismo nombre, ya que los navegadores lo admiten. Sin embargo, no está formalmente documentado, por lo que tendrá que decidir si quiere actuar en consecuencia.

Como alternativa final, ¿hay algún motivo por el que no pueda darles un campo de formulario que les permita elegir el flujo de control en lugar de tener dos botones?

<form method="get" action=""> 
    <input type="text" name="txt" /> 
    <select name="myname"> 
     <option value="A">A</option> 
     <option value="B">B</option> 
    </select> 
    <input type="submit" name="submit" value="Go" /> 
</form> 

ACTUALIZACIÓN

Si quieres dos botones para el caso que usted menciona en su comentario ... es decir, un botón a mitad de camino hacia abajo la forma de refrescar algo basado en un sub-conjunto de entradas y otro botón en la parte inferior para enviar, así es como debe hacer las cosas ...

1) Los botones deben hacer lo mismo, simplemente envíe el formulario.

2) Debe detectar el lado del servidor si tiene un formulario válido (si están trabajando secuencialmente y han llegado al primero de los dos envíos, tendrá entradas en blanco para la segunda mitad del formulario, lo que lo invalida)

3) Debe detectar el lado del servidor si tiene suficiente información para realizar el cálculo o actualización que menciona en su comentario.

En los casos 2 y 3, debe marcar los campos que se requieren para que el usuario proceda.

Esto anula la necesidad de botones particulares para hacer cosas particulares - el usuario podría escribir en la primera mitad del formulario y presionar el botón en la parte inferior, por lo que no debe basar su lógica en qué botón presionado.

+5

Eso suena. Mucho para los estándares. – mpen

+0

He agregado información adicional que puede ser de utilidad, según su nota sobre querer dos botones. Espero que ayude. – Fenton

+0

Sí, quiero * evitar * basándome en el texto mostrado. ¿Qué pasa si quiero que ambos tengan el mismo texto? ¿O qué pasa si el texto es dinámico o contiene personajes extraños? Prefiero no mezclar la lógica de visualización con el código (probando lo que debería ser un valor solo de visualización). Buscando una solución flexible ... esto entra en un marco. Tampoco quiero un cuadro de selección, ralentiza a los usuarios;) – mpen

-2

No adjunte valores a los botones del tipo enviar. Un botón con tipo enviar envía un formulario. Eso es todo lo que hace y debería esperar hacer. Cualquier método de envío de cualquier forma es igual a todos los demás métodos de envío de ese mismo formulario en cuanto a propósito y alcance de datos. Para que sea lógicamente correcto con la intención de HTML, debe usar formularios separados si desea que los datos diferentes se devuelvan condicionalmente al momento del envío.

Entiendo que mi respuesta es inconveniente, pero es la única respuesta correcta sin agregar y eliminar campos de entrada ocultos usando JavaScript.

+0

No estoy de acuerdo. Estás argumentando sobre la semántica, pero hay ocasiones en que las reglas generales deben romperse. El HTML en sí mismo es semánticamente defectuoso; fue diseñado como una combinación de lógica de visualización * y * de visualización semántica, entonces, ¿a quién le importa qué fue * previsto *? Este es el año 2010! Pregunto acerca de qué * funciona * y * es posible *, ya que no vivimos en un mundo ideal :) – mpen

+0

¿Es compatible con Mail Markup Language http://mailmarkup.org/ –

+0

MML? No estoy haciendo un formulario de correo electrónico aquí ... en todo caso usaría XML y XSLT. – mpen

6

esto hará el truco en IE

<button type="submit" name="submit1" value="submit1" onclick="this.value='submit1' ">submit</button> 

simple y funciona en todos los navegadores

+1

Creo que estaba tratando de evitar JS ... – mpen

1

Esto es lo que hice para este problema. Funciona en todos los navegadores.

<form method="get" action=""> 
    <input type="text" name="txt"/> 
    <input type="hidden" name="btn" id="hiddenbtn" /> 
    <button type="submit" name="btn1" value="val">text</button> 
</form> 

Javascript (jQuery Requiere):

$(document).ready(function{ 
    $(":submit[name='btn1']").on("click", function() { 
     $("#hiddenbtn").val($(this).val()); 
    }); 
}); 
Cuestiones relacionadas