2013-07-12 4 views
2

Я передаю сообщение с iframe на его родительскую страницу, используя postMessage. Это мой код. В IFRAME:«данные» являются нулевыми или нет объектами IE8

$(".history_date").click(function(event) { 
    window.top.postMessage($(this).text(), "*"); 
}); 

В родительской страницы:

$(function(){ 
window.onmessage = function(e){ 
    if(e.data){ 
     //do something 

    } 
}; 
}); 

Он хорошо работает в Chrome, Firefox и IE9/10, но в IE8, то indecates ошибка

'данные' является нулевым или не является объектом.

Как это исправить? Заранее спасибо.

+2

* "** 'data' ** является нулевым или не объектом" *? Не 'e'? Поскольку ваш код явно тестирует 'e.data', прежде чем пытаться его использовать, и тест будет' false', если 'data' были' null'. –

ответ

9

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, так и ранее, и браузерами, которые передают объект события в обработчик.

+0

Прохладный! Это подтверждается вашим ответом. Можете ли вы объяснить, что «e = e || window.event;» действительно ли? Я новичок в javascript и jquery. Большое спасибо. – Leoest

+0

+1 Ничего не сказал. – Praveen

+1

@Leoest: Рад, что помогло. Я отредактировал ответ, чтобы объяснить эту строку больше. –

1

console.log не поддерживается в старой версии IE. Попробуйте удалить строку

console.log("message get: "+ e.data); 
+0

@ user1900888 Что содержит 'e'? – Praveen

+1

@ user: IE8 имеет 'console.log', если вы открываете инструменты для разработчиков. (Это не так, если вы этого не делаете.) –

+0

Ничего другого. Я не указал e. – Leoest

Смежные вопросы