Domanda

Il codice generato da .Net per un modulo con il set di attributi "DefaultButton" contiene javascript scadente che consente alla funzionalità di funzionare in IE ma non in altri browser (in particolare Firefox).

Premendo il tasto Invio si invia il modulo con tutti i browser, ma Firefox non può ignorare la pressione del tasto quando avviene all'interno di un controllo <textarea>.Il risultato è un controllo dell'area di testo multilinea che non può essere multilinea in Firefox poiché il tasto Invio invia il modulo invece di creare una nuova riga.

Per ulteriori informazioni sul bug, leggilo qui.

Questo problema potrebbe essere risolto in Asp.Net 3.0+, ma è ancora necessario creare una soluzione alternativa per 2.0.

Qualche idea per la soluzione più leggera (un hack che non assomigli ad un hack =D)?La soluzione nel collegamento sopra mi spaventa un po' perché potrebbe facilmente avere effetti collaterali indesiderati.

È stato utile?

Soluzione

Utilizzo questa funzione adattata da codesta.[Modificare:proprio quello, vedo, che ti spaventa!Ops.Non posso aiutarti allora.]

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

Lo usi circondando il tuo codice con un div in questo modo.Potresti creare una sottoclasse del modulo per includerlo automaticamente.Non lo uso molto, quindi non l'ho fatto.

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

Ecco la funzione.

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;
}

Altri suggerimenti

Sembra che la correzione codesta.com a cui si collega Harpo non sia più necessaria, poiché la correzione event.srcElement non è integrata in ASP.NET 3.5.L'implementazione di DefaultButton presenta tuttavia ancora alcuni problemi, poiché in troppi casi rileva la pressione del tasto Invio.Per esempio:Se hai attivato un pulsante nel modulo utilizzando la scheda, premendo Invio dovresti fare clic sul pulsante e non inviare il modulo.

Includi il seguente codice JavaScript nella parte inferiore della pagina Web ASP.NET per fare in modo che Enter si comporti come dovrebbe.

// 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;
}

Per questo particolare problema, il motivo è perché JavaScript generato da ASP.NET 2.0 ha solo una notazione IE:event.srcelement non è disponibile in Firefox (usa invece event.target):

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;
}

Se cambiamo le prime 2 righe in:

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

Inserisci il codice modificato in un file e poi esegui

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

Quindi funzionerà sia per IE che per FireFox.

Fonte:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top