IE выдает ошибку «Требуется объект» при попытке использовать объект события из другого окна / фрейма - PullRequest
0 голосов
/ 26 августа 2010

Я обнаружил ошибку JavaScript в разрабатываемом скрипте.Я сократил его до пары довольно лаконичных страниц, которые по-прежнему выдают ошибку:

Если вы загрузитена первой странице в Internet Explorer 8 (или, вероятно, 6 или 7), дайте ему примерно полсекунды для запуска сценария, затем нажмите ссылку "Google" внутри <iframe>, вы должны увидеть сообщение об ошибкепоявляются:

http://skitch.com/troywarr/dui21/ie8-error

(Вам может понадобиться снять отметку Tools > Internet Options > Advanced > "Disable script debugging (Internet Explorer)" и отметить "Display a notification about every script error" двумя строками ниже, чтобы увидеть сообщения об ошибках.)

Запуск отладчикапоказывает красиво проницательное сообщение «Требуется объект»:

http://skitch.com/troywarr/dui26/ie8-debugging

Виновником является строка:

target = event_object.target || event_object.srcElement;

Я думаю, что это правильный код - по крайней мере, он работаетв Firefox.Мое лучшее предположение состоит в том, что существует проблема с попыткой доступа к объекту события одного кадра из другого - примерно так же, как то, почему вы не можете полагаться на instanceof для обнаружения массивов, если они были созданы в другом окне / кадре (поискдля «контекста» на http://javascript.crockford.com/remedial.html, если это не имеет смысла).

Похоже ли это на действительную теорию?Если так, что я могу сделать, чтобы это исправить?Если это вообще возможно, мне нужно сохранить ту же общую структуру / функциональность кода:

  • На странице есть ссылка <iframe>.
  • Скрипт в <iframe> вызывает функцию на родительской странице, которая присоединяет обработчик события к элементу в <iframe> с указанным атрибутом id.
  • Нажатие на ссылку <iframe> d вызывает событие, которое вызываетфункция на родительской странице, передающая объект события по умолчанию.
  • Функция на родительской странице определяет информацию о выбранном элементе (<a>) из объекта события кросс-браузерно-совместимым способом.

Я также хотел бы продолжить использование делегирования событий и сохранить все функции в родительском документе, просто вызывая их с аргументами из документа <iframe> d.Однако, если у вас есть предложения по альтернативным подходам, я бы хотел их услышать.

Заранее благодарен за любую помощь!Пожалуйста, дайте мне знать, если вам нужно больше объяснений о моих требованиях или о том, что я пытаюсь сделать - я надеюсь, что есть просто лучший способ получить доступ или передать объект события, о котором я не знаю - "ОДа, вам просто нужно сделать это, как этот "вид решения.Я надеюсь, что это не желаемое за действительное.; -)

1 Ответ

3 голосов
/ 26 августа 2010

Легко исправляется. Вам нужен объект события из фрейма window. Храните объект iframe window рядом с тем местом, где хранится его документ:

var iframe_win = document.getElementsByTagName('iframe')[0].contentWindow;

... и обновите строку, которая получает объект события в вашей функции-обработчике события:

event_object = event_object || iframe_win.event;
...