Pregunta

El código generado por .Net para un formulario con el conjunto de atributos "DefaultButton" contiene un javascript deficiente que permite que la funcionalidad funcione en IE pero no en otros navegadores (específicamente Firefox).

Al presionar la tecla Intro se envía el formulario con todos los navegadores, pero Firefox no puede ignorar la pulsación de la tecla cuando ocurre dentro de un control <textarea>.El resultado es un control de área de texto de varias líneas que no puede ser de varias líneas en Firefox ya que la tecla Intro envía el formulario en lugar de crear una nueva línea.

Para obtener más información sobre el error, léelo aquí.

Esto podría solucionarse en Asp.Net 3.0+, pero aún es necesario crear una solución alternativa para 2.0.

¿Alguna idea para la solución más ligera (un truco que no parece un truco =D)?La solución en el enlace anterior me asusta un poco ya que fácilmente podría tener efectos secundarios no deseados.

¿Fue útil?

Solución

Utilizo esta función adaptada de codesta.[Editar:el mismo, ya veo, que te da miedo!Ups.Entonces no puedo ayudarte.]

http://blog.codesta.com/codesta_weblog/2007/12/net-gotchas---p.html.

Lo usas rodeando tu código con un div como este.Puede subclasificar el formulario para incluirlo automáticamente.No lo uso mucho, así que no lo hice.

<div onkeypress="return FireDefaultButton(event, '<%= aspButtonID.ClientID %>')">
    (your form goes here)
</div>

Aquí está la función.

function FireDefaultButton(event, target) 
{
    // srcElement is for IE
    var element = event.target || event.srcElement;

    if (13 == event.keyCode && !(element && "textarea" == element.tagName.toLowerCase())) 
    {
        var defaultButton;
        defaultButton = document.getElementById(target);

        if (defaultButton && "undefined" != typeof defaultButton.click) 
        {
            defaultButton.click();
            event.cancelBubble = true;
            if (event.stopPropagation) 
                event.stopPropagation();
            return false;
        }
    }
    return true;
}

Otros consejos

Parece que la solución codesta.com al que se vincula Harpo ya no es necesaria, ya que la solución event.srcElement no está integrada en ASP.NET 3.5.Sin embargo, la implementación de DefaultButton todavía tiene algunos problemas, porque en demasiados casos capta la pulsación de la tecla Enter.Por ejemplo:Si ha activado un botón en el formulario usando la pestaña, al presionar Enter debería hacer clic en el botón y no enviar el formulario.

Incluya el siguiente código JavaScript en la parte inferior de su página web ASP.NET para que Enter se comporte como debería.

// Fixes ASP.NET's behavior of default button by testing for more controls
// than just textarea where the event should not be caugt by the DefaultButton
// action. This method has to override ASP.NET's WebForm_FireDefaultButton, so
// it has to included at the bottom of the page.
function WebForm_FireDefaultButton(event, target) {
  if (event.keyCode == 13) {
    var src = event.srcElement || event.target;
    if (!(
      src
      &&
      (
        src.tagName.toLowerCase() == "textarea"
        || src.tagName.toLowerCase() == "a"
        ||
        (
          src.tagName.toLowerCase() == "input"
          &&
          (
            src.getAttribute("type").toLowerCase() == "submit"
            || src.getAttribute("type").toLowerCase() == "button"
            || src.getAttribute("type").toLowerCase() == "reset"
          )
        )
        || src.tagName.toLowerCase() == "option"
        || src.tagName.toLowerCase() == "select"
      ) 
    )) {
      var defaultButton;
      if (__nonMSDOMBrowser) {
        defaultButton = document.getElementById(target);
      }
      else {
        defaultButton = document.all[target];
      }
      if (defaultButton && typeof (defaultButton.click) != "undefined") {
        defaultButton.click();
        event.cancelBubble = true;
        if (event.stopPropagation) event.stopPropagation();
        return false;
      }
    }
  }
  return true;
}

Para este problema en particular, la razón es porque JavaScript generado por ASP.NET 2.0 tiene alguna notación de solo IE:Event.srcelement no está disponible en Firefox (use Event.Target en su lugar):

function WebForm_FireDefaultButton(event, target) {
if (!__defaultFired && event.keyCode == 13 && !(event.srcElement && 
(event.srcElement.tagName.toLowerCase() == "textarea"))) {
var defaultButton;
if (__nonMSDOMBrowser) {
defaultButton = document.getElementById(target);
}
else {
defaultButton = document.all[target];
}
if (defaultButton && typeof(defaultButton.click) != 
"undefined") {
__defaultFired = true;
defaultButton.click();
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
}
}
return true;
}

Si cambiamos las primeras 2 líneas a:

function WebForm_FireDefaultButton(event, target) {
var element = event.target || event.srcElement;
if (!__defaultFired && event.keyCode == 13 && !(element && 
(element.tagName.toLowerCase() == "textarea"))) {

Coloque el código modificado en un archivo y luego haga

protected void Page_Load(object sender, EventArgs e)
{
ClientScript.RegisterClientScriptInclude("js1", "JScript.js");
}

Entonces funcionará tanto para IE como para Firefox.

Fuente:

http://www.velocityreviews.com/forums/t367383-formdefaultbutton-behaves-incorrectly.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top