Находится ли на перекрестке браузер? - PullRequest
1 голос
/ 25 августа 2010

перед публикацией я пытаюсь найти решение на этом сайте и в Google, но теперь мне повезло.

У меня проблема с IE8 , этот код ниже добавляет на летуIFRAME и отлично работает в Chrome, Firefox и IE7.

Проблема в том, что функция keyHandler () не запускается только в IE8 .

Какое решение является наилучшимприсоединить кроссбраузер событий как onkeydown?

(также будет приятно поддерживать Safari и Opera, будет ли IE9 также поддерживаться с этим кодом?)

ps i в настоящее времяиспользуйте prototype.js , встроенный blank.htm имеет contenteditable на и правильно DOCTYPE -> (также на главной странице, где вызывается функция)

Выкладываю код ниже и заранее благодарю за советы и подсказки

function addFrame() {
var editorFrame = 'myEditor', iFrame;

var newFrame = new Element('iframe', {width: '320px', height: '70px',id: editorFrame, name: editorFrame, src:'/blank.htm'});

$('container').appendChild(newFrame);

if(document.all) {
    iFrame = window.frames[editorFrame];

    if (window.document.addEventListener)
        iFrame.document.addEventListener('keydown', keyHandler, false);
    else 
        iFrame.document.attachEvent('onkeydown', keyHandler);  // OK IE7
}
else {
    // OK Firefox, Chrome
    iFrame = $(editorFrame).contentWindow;
    iFrame.addEventListener('keydown', keyHandler, false);
}

}

1 Ответ

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

Хм.Несколько проблем с вашим кодом.

  1. Не используйте document.all.В настоящее время это полностью избыточно.
  2. При использовании addEventListener тип события не имеет префикса «on», поэтому вы хотите «keydown» вместо «onkeydown».
  3. Test theобъекты, которые вы собираетесь использовать, скорее делают выводы из существования не связанных между собой объектов.Протестируйте addEventListener напрямую.
  4. Нет необходимости в ветвлении для Chrome и Firefox.Вы можете использовать contentWindow во всех последних браузерах, хотя это нестандартно (contentDocument.defaultView является стандартом).
  5. Обработчик 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
        }
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...