Хм.Несколько проблем с вашим кодом.
- Не используйте
document.all
.В настоящее время это полностью избыточно. - При использовании
addEventListener
тип события не имеет префикса «on», поэтому вы хотите «keydown» вместо «onkeydown». - Test theобъекты, которые вы собираетесь использовать, скорее делают выводы из существования не связанных между собой объектов.Протестируйте
addEventListener
напрямую. - Нет необходимости в ветвлении для Chrome и Firefox.Вы можете использовать
contentWindow
во всех последних браузерах, хотя это нестандартно (contentDocument.defaultView
является стандартом). - Обработчик
keydown
можно применять к документу iframe во всех браузерах.
Интересно, возможно, проблема IE 8 в том, что document.all
, возможно, был удален, но я не знаю точно.Я не использовал document.all
ни в одном коде с 1999 года.
Другая возможность, которая приходит мне в голову, заключается в том, что window.frames
использует name
кадра, а не его идентификатор.* ОБНОВЛЕНИЕ
Извините, я не проверял свой код.Проверив это сейчас, я понял, что это сложнее, чем я помнил.Вы не можете безопасно прикрепить обработчик keydown
до тех пор, пока не загрузится документ iframe, что немного усложняет задачу.Самый простой способ заставить его работать во всех браузерах - это обработать событие load
в blank.htm
и вызвать функцию на главной странице:
В blank.htm добавьте следующее:
<script type="text/javascript">
window.onload = function() {
parent.iframeLoaded();
};
</script>
В основном документе:
function addFrame() {
var editorFrame = 'myEditor', iFrame;
var newFrame = new Element('iframe', {
width: '520', // width and height properties do not have units
height: '200',
id: editorFrame,
name: editorFrame,
src: 'blank.htm'
});
$('container').appendChild(newFrame);
window.iframeLoaded = function() {
var iframeDoc, UNDEF = "undefined";
if (typeof newFrame.contentDocument != UNDEF) {
iframeDoc = newFrame.contentDocument;
} else if (typeof newFrame.contentWindow != UNDEF) {
iframeDoc = newFrame.contentWindow.document;
} else {
throw new Error("Unable to access iframe document");
}
if (typeof iframeDoc.addEventListener != UNDEF) {
iframeDoc.addEventListener('keydown', keyHandler, false);
} else if (typeof iframeDoc.attachEvent != UNDEF) {
iframeDoc.attachEvent('onkeydown', keyHandler); // OK IE7
}
};
}