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?
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;
// ...
}
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.
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);"
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;
// ...
}
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
.
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)