IE8 еще не хватает вложений событий DOM2, по-прежнему используя глобальный event
объект, а не один он проходит в обработчики событий. Вы сказали, что ошибка 'data' is null or not an object
, вы уверены, что это не 'e' is null or not an object
?
Если это так, то это должно исправить:
window.onmessage = function(e){
e = e || window.event;
if (e.data) {
// ...
}
};
На IE8 и ранее, ни один аргумент не передается в обработчики событий. Вместо этого вы смотрите на глобальную переменную event
(глобальные переменные также являются свойствами объекта window
). Итак, на IE8 и ранее, e
будет undefined
, тогда как на IE9 + и всех других браузерах объект события будет e
.
Так эта линия:
e = e || window.event;
... использует the curiously-powerful ||
operator, который будет возвращать свой первый аргумент, если этот аргумент «truthy» или его второй аргумент, если первый является «falsey.» Поскольку undefined
ложно, на IE8 и ранее, e = e || window.event
присваивает window.event
до e
. В IE9 + и во всех других браузерах он просто присваивает e
обратно себе (нет-op).
Это общий шаблон кода, который должен взаимодействовать как с IE8, так и ранее, и браузерами, которые передают объект события в обработчик.
* "** 'data' ** является нулевым или не объектом" *? Не 'e'? Поскольку ваш код явно тестирует 'e.data', прежде чем пытаться его использовать, и тест будет' false', если 'data' были' null'. –