2008-09-08 14 views
5

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 spécifiquement).Erreur Form.Batton Asp.Net dans Firefox

En appuyant sur la touche d'entrée, vous soumettez le formulaire avec tous les navigateurs, mais Firefox ne peut pas ignorer la touche lorsque celle-ci se produit dans 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 clé d'entrée soumet le formulaire au lieu de créer une nouvelle ligne.

Pour plus d'informations sur le bogue, read it here.

Cela pourrait être corrigé dans Asp.Net 3.0+, mais une solution de contournement doit encore être créé 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 dans le lien ci-dessus m'effraie un peu car elle pourrait facilement avoir des effets secondaires involontaires.

Répondre

4

J'utilise cette fonction adaptée de codesta. [Edit: le même, je vois, qui vous fait peur! Oops. Vous ne pouvez pas vous aider alors.]

http://blog.codesta.com/codesta_weblog/2007/12/net-gotchas---p.html. Vous l'utilisez en entourant votre code avec une div comme ça. Vous pouvez sous-classer le formulaire pour l'inclure automatiquement. Je ne l'utilise pas beaucoup, alors je ne l'ai pas utilisé.

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

Pour cette question, la raison est parce que le javascript généré par ASP.NET 2.0 a quelques IE uniquement notation: event.srcElement n'est pas availabe dans FireFox (utilisation 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 nous changeons les 2 premières lignes dans:

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

Mettre le code modifié dans un fichier, puis faire

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

Ensuite, il travaillera à la fois pour IE et FireFox.

Source:

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

3

Il semble que le codesta.com de correctif Harpo lien vers n'est plus nécessaire, puisque le correctif est event.srcElement integrade pas dans ASP.NET 3.5. L'implémentation de DefaultButton a cependant toujours quelques problèmes, car il touche trop la touche Entrée dans trop de cas. Par exemple: Si vous avez activé un bouton dans le formulaire à l'aide de la tabulation, appuyez sur Entrée pour cliquer sur le bouton et ne pas soumettre le formulaire.

Incluez le code JavaScript suivant en bas de votre page Web ASP.NET pour que Entrer se comporte comme il le devrait.

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