2008-09-08 6 views
5

Der .Net generierte Code für ein Formular mit dem Attribut "DefaultButton" enthält armes Javascript, das die Funktionalität in IE, aber nicht in anderen Browsern (speziell Firefox) funktioniert.Asp.Net Form DefaultButton Fehler in Firefox

Mit der Enter-Taste wird das Formular mit allen Browsern gesendet, aber Firefox kann den Tastendruck nicht ignorieren, wenn es in einem <Textbereich> Steuerelement passiert. Das Ergebnis ist ein mehrzeiliges Textbereichssteuerelement, das in Firefox nicht mehrzeilig sein kann, da der Eingabetaste das Formular übergibt, anstatt eine neue Zeile zu erstellen.

Für weitere Informationen über den Fehler, read it here.

Dies könnte in Asp.Net 3.0 + behoben werden, aber ein Workaround muss noch für 2.0 erstellt werden.

Irgendwelche Ideen für die leichteste Workaround (ein Hack, der nicht wie ein Hack aussieht = D)? Die Lösung in der obigen Verbindung macht mir ein wenig Angst, da sie unbeabsichtigte Nebenwirkungen haben könnte.

Antwort

4

Ich benutze diese Funktion von codesta angepasst. [Edit: die gleiche, ich sehe, dass Sie Angst macht! Hoppla. Kann Ihnen dann nicht helfen.]

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

Sie verwenden es, indem Sie Ihren Code mit einem div so umgeben. Sie könnten das Formular von der Unterklasse ableiten, um dies automatisch einzubeziehen. Ich benutze es nicht so oft, also tat ich es nicht.

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

Hier ist die Funktion.

 
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

Für diese besondere Ausgabe, ist der Grund, weil Javascript von ASP.NET erzeugt 2.0 einige nur IE-Notation hat: event.srcElement nicht (statt Verwendung event.target) in FireFox availabe ist:

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

Wenn wir die ersten zwei Zeilen in ändern:

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

Setzen Sie den geänderten Code in einer Datei und dann tun

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

Dann funktioniert es für IE und FireFox.

Quelle:

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

3

Es scheint, dass das Update codesta.com, die auf Harpo nicht mehr notwendig ist, da das Update event.srcElement nicht in ASP.NET 3.5 integrade. Die Implementierung von DefaultButton hat jedoch immer noch einige Probleme, da die Eingabetaste in zu vielen Fällen gedrückt wird. Beispiel: Wenn Sie eine Schaltfläche im Formular über die Registerkarte aktiviert haben, drücken Sie die Eingabetaste, wenn Sie auf die Schaltfläche klicken und das Formular nicht senden.

Fügen Sie den folgenden JavaScript-Code am unteren Rand Ihrer ASP.NET-Webseite ein, damit Enter sich so verhält, wie es sollte.

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