Asp.Net Form DefaultButton Fehler in Firefox
Frage
Die .Net generierten code für ein Formular mit der "DefaultButton" - Attribut enthält Armen javascript ermöglicht das funktioniert in IE, aber nicht in anderen Browsern (Firefox, specifcially).
Drücken der enter-Taste senden Sie das Formular mit allen Browsern, aber Firefox kann nicht außer acht lassen, die Taste zu drücken, wenn es passiert innerhalb von ein <textarea> Kontrolle.Das Ergebnis ist ein mehrzeiliges Textfeld-Steuerelement, das kann nicht sein, multiline in Firefox als Sie die enter-Taste sendet das Formular erstellen, anstatt eine neue Zeile.
Für weitere Informationen über die Fehler, Lesen Sie es hier.
Dies könnte behoben werden Asp.Net 3.0+ aber einen workaround hat immer noch erstellt werden für 2.0.
Ideen für die leichtesten Abhilfe (einen hack, der nicht aussieht wie ein hack =D)?Die Lösung im obigen link erschreckt mich ein wenig, da es leicht zu unerwünschten Nebenwirkungen.
Lösung
Ich benutze diese Funktion angepasst codesta.[Bearbeiten:die sehr gleiche, ich sehe, dass Sie Angst!Oops.Kann nicht helfen Sie dann.]
http://blog.codesta.com/codesta_weblog/2007/12/net-gotchas---p.html.
Sie verwenden es, um Ihren code in ein div so gerne.Sie könnten eine Unterklasse der Form, um diese automatisch.Ich benutze es nicht so viel, deshalb habe ich 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; }
Andere Tipps
Es scheint, dass das Update codesta.com dass harpo link ist nicht mehr notwendig, da das Update-Ereignis.srcElement ist nicht integriert in ASP.NET 3.5.Die Umsetzung der DefaultButton jedoch noch ein paar Probleme, weil es ist, fangen Sie die Enter-Taste drücken in viel zu vielen Fällen.Zum Beispiel:Wenn Sie aktiviert wurde, wird die Schaltfläche im Formular mit tab, drücken Sie die EINGABETASTE, klicken Sie auf die Schaltfläche, und nicht das Formular Absenden.
Umfassen Sie den folgenden JavaScript-code auf der Unterseite Ihres ASP.NET web-Seite zu machen, Geben Sie Verhalten sich so wie es soll.
// 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;
}
Für dieses spezielle Problem, der Grund ist, dass javascript-generiert durch ASP.NET 2.0 hat einige nur IE-notation:event.srcElement ist nicht erhältlich in FireFox (verwenden Sie event.Ziel statt):
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 uns ändern die ersten 2 Zeilen in:
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 führen Sie dann
protected void Page_Load(object sender, EventArgs e)
{
ClientScript.RegisterClientScriptInclude("js1", "JScript.js");
}
Dann wird es Arbeit für IE und FireFox.
Quelle:
http://www.velocityreviews.com/forums/t367383-formdefaultbutton-behaves-incorrectly.html