web-dev-qa-db-fra.com

Erreur Firefox "window.event est indéfinie"

J'ai ce script:

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

J'utilise ce script avec onclick="postBackByObject();"

mais dans Firefox 21, j'obtiens cette erreur:

TypeError: window.event n'est pas défini 

quel est mon tort?

12
Majid

C'est parce que c'est. window.event est pour les anciennes versions de IE.

La manière typique de faire ceci est:

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

Vous attachez des événements inline onclick="postBackByObject();"

Essayez de passer this (cible de l'événement) à onclick="postBackByObject(this);" Modifiez votre fonction pour gérer ce changement:

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

Une meilleure alternative sera d’attacher des événements en utilisant addEventListener

Si votre balisage ressemble à:

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

puis

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

Votre fonction postBackByObject reste inchangée lorsque vous utilisez cette approche.

7
c.P.u1

L'attachement à l'événement est une solution, mais il existe une autre solution qui pourrait être utile aux autres personnes confrontées au même problème. Après une longue recherche, j'ai découvert que:

Firefox ne reconnaît l’objet événement que si vous envoyez explicitement l’événement de la fonction

Donc, le problème se produit parce que window.event n'est pas reconnu par Firefox et que la solution consiste à passer event à la fonction. Votre code sera:

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

Et vous pouvez toujours l'appeler dans votre code HTML incorporé en passant event en tant que paramètre:

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

Il est possible de passer un objet événement dans la déclaration en ligne:

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

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

Votre ligne 

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

échoue sur tous les navigateurs sauf IE, puisque windows.event est indéfini

La formulation appropriée serait:

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

Étant donné que les navigateurs compatibles standard transmettent l'événement en tant que paramètre e et Cible à e.target dans IE, e sera indéfini et vous devez utiliser window.event.srcElement

Notez que les versions récentes de IE prennent en charge le modèle conforme aux normes.

Sur une note plus générique, lorsque vous essayez d'accéder à une valeur sous la forme a.b.c.d, puis a.b.c mustbe, un objet défini sinon vous obtiendrez l'erreur a.b.c undefined.

1
HBP

je ne sais pas si window.event est pris en charge par tous les navigateurs. Je pense que vous obtenez un événement dans la variable "e" de postBackByObject (e)

0
amit