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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top