it-swarm.com.de

Firefox-Fehler "window.event is undefined"

Ich habe dieses Skript:

function postBackByObject(e) {
   var o = window.event.srcElement || e.target;
   if (o.tagName == "INPUT" && o.type == "checkbox") {
        __doPostBack("", "");
    }
}

Ich benutze dieses Skript mit onclick="postBackByObject();"

aber in Firefox 21 bekomme ich diese Fehlermeldung:

TypeError: window.event ist nicht definiert 

was ist mein falsch?

12
Majid

Weil es so ist. window.event ist für ältere Versionen von IE.

Der typische Weg dies zu tun ist:

function postBackByObject(e) {
    e = e || window.event;
    var o = e.srcElement || e.target;
    // ...
}
15

Sie hängen Ereignisse inline an onclick="postBackByObject();"

Übergeben Sie this (das Ereignisziel) an onclick="postBackByObject(this);" Ändern Sie Ihre Funktion, um diese Änderung zu verarbeiten:

function postBackByObject(e) {
   if (e.tagName == "INPUT" && e.type == "checkbox") {
        __doPostBack("", "");
    }
}

Eine bessere Alternative ist das Anhängen von Ereignissen mit addEventListener.

Wenn Ihr Markup so aussieht:

<div id="TvCategories" onclick="postBackByObject(this);" />

dann

document.getElementById('TvCategories').addEventListener('click', postBackByObject);

Ihre postBackByObject-Funktion bleibt bei diesem Ansatz unverändert.

7
c.P.u1

Übergeben Sie das Ereignis auf dem Ereignis onClick wie folgt:

onclick="myCustomFunction(event);"

Es funktioniert und Sie können auf das Ereignisobjekt zugreifen!

3
Deian Motov

Das Anhängen des Ereignisses ist eine Lösung, aber es gibt eine Alternative, die für andere Personen hilfreich sein könnte, die das gleiche Problem haben. Nach langer Suche habe ich herausgefunden, dass:

Ereignisobjekte werden von Firefox nur dann wiederhergestellt, wenn Sie explizit das 'Ereignis' von der Funktion senden

Das Problem tritt also auf, weil window.event von Firefox nicht erkannt wird und die Lösung darin besteht, event an die Funktion zu übergeben. Ihr Code lautet:

function postBackByObject(e) {
   var o = e.srcElement || e.target;
   if (o.tagName === "INPUT" && o.type === "checkbox") {
        __doPostBack("", "");
    }
}

Und Sie können es immer noch in Ihrem Inline-HTML aufrufen, indem Sie event als Parameter übergeben:

onclick="postBackByObject(event);"
2
cнŝdk

Event-Objekt kann in der Inline-Deklaration übergeben werden:

<input type="button" onclick="postBackByObject(event);" value="click" />

function postBackByObject(e) {
    var o = e.srcElement || e.target;
    // ...
}
2
Dmitry

Ihre Linie 

var o = window.event.srcElement || e.target;

schlägt in allen Browsern außer IE fehl, da für sie windows.event nicht definiert ist

Die richtige Formulierung wäre:

var o = e ? e.target : window.event.srcElement;

Da standardkonforme Browser das Ereignis als Parameter e und Des Ziels an e.target im IE übergeben, wird e nicht definiert und Sie müssen window.event.srcElement verwenden.

Beachten Sie, dass neuere Versionen von IE das standardkonforme Modell unterstützen.

Allgemeiner Hinweis: Wenn Sie versuchen, auf einen Wert als a.b.c.d zuzugreifen, dann a.b.c mussein anderes definiertes Objekt. Andernfalls erhalten Sie den Fehler a.b.c undefined.

1
HBP

ich bin mir nicht sicher, ob window.event in allen Browsern unterstützt wird. Ich denke, Sie erhalten Ereignis in Variable "e" of postBackByObject (e)

0
amit