Question

Le code généré par .Net pour un formulaire avec l'ensemble d'attributs "DefaultButton" contient un javascript médiocre qui permet à la fonctionnalité de fonctionner dans IE mais pas dans d'autres navigateurs (Firefox en particulier).

Appuyer sur la touche Entrée soumet le formulaire avec tous les navigateurs, mais Firefox ne peut pas ignorer la pression sur la touche lorsqu'elle se produit à l'intérieur d'un contrôle <textarea>.Le résultat est un contrôle de zone de texte multiligne qui ne peut pas être multiligne dans Firefox car la touche Entrée soumet le formulaire au lieu de créer une nouvelle ligne.

Pour plus d'informations sur le bug, lis-le ici.

Cela pourrait être corrigé dans Asp.Net 3.0+, mais une solution de contournement doit encore être créée pour 2.0.

Des idées pour la solution de contournement la plus légère (un hack qui ne ressemble pas à un hack =D) ?La solution présentée dans le lien ci-dessus me fait un peu peur car elle pourrait facilement avoir des effets secondaires involontaires.

Était-ce utile?

La solution

J'utilise cette fonction adaptée de codesta.[Modifier:c'est justement celui-là, je vois, qui te fait peur !Oops.Alors je ne peux pas t'aider.]

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

Vous l'utilisez en entourant votre code d'un div comme ceci.Vous pouvez sous-classer le formulaire pour l'inclure automatiquement.Je ne l'utilise pas beaucoup, donc je ne l'ai pas fait.

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

Voici la fonction.

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

Autres conseils

Il semble que le correctif codesta.com auquel harpo renvoie n'est plus nécessaire, car le correctif event.srcElement n'est pas intégré dans ASP.NET 3.5.L'implémentation de DefaultButton présente cependant encore quelques problèmes, car elle détecte la pression sur la touche Entrée dans de trop nombreux cas.Par exemple:Si vous avez activé un bouton dans le formulaire à l'aide de l'onglet, appuyer sur Entrée devrait cliquer sur le bouton et ne pas soumettre le formulaire.

Incluez le code JavaScript suivant au bas de votre page Web ASP.NET pour que Enter se comporte comme il se doit.

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

Pour ce problème particulier, la raison en est que JavaScript généré par ASP.NET 2.0 a une notation IE uniquement:event.srcelement n'est pas disponible dans Firefox (utilisez Event.target à la place):

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 on change les 2 premières lignes en :

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

Mettez le code modifié dans un fichier puis faites

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

Ensuite, cela fonctionnera pour IE et FireFox.

Source:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top