Firefox "помилка" window.event is undefined "

Я маю цей сценарій:

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

Я використовую цей сценарій за допомогою onclick = "postBackByObject ();" .

але в Firefox 21 я отримую цю помилку:

<�Р> TypeError: window.event не визначене

що моє не так?

12
@AyyappanSekar для URL-адрес у коментарях використовуйте формат [text] (http://uri.com/) текст
додано Автор Paul S., джерело
Перевірте це ... stackoverflow.com/questions/9813445/ …
додано Автор Ayyappan Sekar, джерело

7 Відповіді

Це тому, що це таке. window.event для старих версій IE.

Типовим способом це зробити є:

function postBackByObject(e) {
    e = e || window.event;
    var o = e.srcElement || e.target;
   //...
}
15
додано
Вибачте, помилка, мала бути логічною.
додано Автор Niet the Dark Absol, джерело
Uhh, це те, що я отримую, не отримуючи ніякого сну XD
додано Автор Niet the Dark Absol, джерело
Що ви маєте на увазі e не визначено ? Ви просто визначили його в визначенні функції ...
додано Автор Niet the Dark Absol, джерело
тепер ця помилка: TypeError: e не визначено
додано Автор Majid, джерело
Я знаю це, це дивно!
додано Автор Majid, джерело
@ Колінік, у вас все ще відсутній набір круглих дужок, тому ви не отримаєте недійсну ліву частину у винятковому призначенні e || (e = x); або поміняйте = і || (але це повторне призначення, навіть якщо він вже призначений).
додано Автор Paul S., джерело
типовим способом є побітовий АБО ?!
додано Автор Paul S., джерело
Це має бути правильною відповіддю, оскільки вона пояснює, ЧОМУ ми отримуємо помилку "windows.event is undefined", у той час як "Accepted" - це не так. Багато оцінив Ніт.
додано Автор KurzedMetal, джерело
Це стає трохи гіршим, якщо у вас є тег HTML на сторінці з id = "event", тоді THAT стає window.event у FF (37)
додано Автор Danimal, джерело
дуже добре пояснив дякую :)
додано Автор Balaji Chandrasekaran, джерело

You are attaching events inline onclick="postBackByObject();"

Спробуйте передати this (ціль події) на onclick = "postBackByObject (this);" Змінити свою функцію, щоб впоратися з цією зміною:

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

A better alternative will be to attach events using addEventListener

Якщо ваша розмітка виглядає так:

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

потім

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

Функція postBackByObject залишається незмінною при використанні цього підходу.

6
додано
Друга помилка підходу: o не визначено, але працює! Дякую
додано Автор Majid, джерело
немає помилок, але не працює, дякую за вашу спробу -> + 1
додано Автор Majid, джерело
!!!! дайте мені цю помилку: не може конвертувати 'o' в об'єкт
додано Автор Majid, джерело
перший підхід не працює
додано Автор Majid, джерело
<div id = "TvCategories" onclick = "postBackByObject ();">
додано Автор Majid, джерело
вибачте, де я повинен поставити obj.addEventListener ('click', postBackByObject); ?
додано Автор Majid, джерело
Який елемент має onclick = 'postBackByObject ()' ? До речі, перший підхід повинен працювати: onclick = "postBackByObject (this);" .
додано Автор c.P.u1, джерело
Перший підхід вказує на використання цього в виклику методу. <div id = "TvCategories" onclick = "postBackByObject (this);">
додано Автор c.P.u1, джерело
Будь ласка, видаліть перший рядок з postBackByObject . Аргумент e належить до самого цільового об'єкта. Я оновив свій пост з новою функцією.
додано Автор c.P.u1, джерело
Саме тому я рекомендував використовувати 2-й підхід. Це буде працювати напевно. Використовуючи 2-й підхід, збережіть функцію postBackByObject як таку (не видаляйте перше твердження).
додано Автор c.P.u1, джерело
Для мене onclick = "postBackByObject (this)" не працює, але в FireFox працює onclick = "postBackByObject (event)" .
додано Автор user2443147, джерело

Передайте подію на подію onClick подібно до цього:

onclick = "myCustomFunction (event);"

Це працює, і ви можете отримати доступ до об'єкта події!

3
додано
Це було дуже корисно. Отже, імена мають важливе значення, оскільки використання цього замість event передасть об'єкт замість події
додано Автор Daniel F, джерело

Прикріплення події - це рішення, але існує альтернативний варіант, який може бути корисним для інших людей, які стикаються з тією ж проблемою, після довгого пошуку я дізнався, що:

Об'єкт події відтворюється тільки Firefox, якщо явно надсилає "подія" з функції

Отже, проблема виникає, оскільки firefox не розпізнає window.event , і рішення полягає в тому, щоб передавати функцію event , ваш код буде:

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

І ви все ще можете викликати це у своєму вбудованому HTML, передаючи event як параметр:

onclick="postBackByObject(event);"
2
додано

Можна передавати об'єкт події у вбудованому декларації:

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

function postBackByObject(e) {
    var o = e.srcElement || e.target;
   //...
}
2
додано

Ваша лінія

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

помилка в усіх браузерах, окрім IE, оскільки для них windows.event не визначено

Правильною формулюванням буде:

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

Since standard compliant browsers will pass the event as the parameter e and the target at e.target in IE, e will be undefined and you must use window.event.srcElement

Зауважте, що останні версії IE підтримують стандартну модель.

На більш загальній нотації, коли ви намагаєтесь отримати доступ до значення як a.b.c. , то a.b.c має бути визначеним об'єктом ще, ви отримаєте помилку a.b.c undefined .

1
додано

i am not sure if window.event is supported in all browsers. I think you get event in variable "e" of postBackByObject(e)

0
додано
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram