2010-08-25 2 views
1

прежде чем писать, я пытаюсь найти решение на этом сайте и google, но теперь удача.Переключатель onkeydown на IFRAME?

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

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

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

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

P.S. я в настоящее время используют prototype.js, то Embeded 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); 
} 

}

ответ

3

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

  1. Не использовать document.all. В наши дни это полностью избыточно.
  2. При использовании addEventListener тип события не имеет префикса «on», поэтому вы хотите «keydown» вместо «onkeydown».
  3. Проверьте объекты, которые вы собираетесь использовать, скорее сделайте выводы из существования несвязанных объектов. Тест addEventListener напрямую.
  4. Разветвление для Chrome и Firefox не нужно. Вы можете использовать contentWindow во всех последних браузерах, хотя он нестандартен (contentDocument.defaultView - стандарт).
  5. Обработчик keydown может применяться к документу iframe во всех браузерах.

Возможно, проблема с IE 8 могла быть удалена, но я действительно не знаю, может быть, document.all. Я не использовал document.all в любом коде с 1999 года.

Другая возможность, которая возникает для меня, заключается в том, что window.frames использует name кадра, а не его идентификатор.

UPDATE

Извиняюсь, я не проверял свой код. Испытав его, я понял, что это сложнее, чем я помню. Вы не можете безопасно присоединить обработчик keydown до тех пор, пока не будет загружен документ iframe, что делает вещи немного сложными. Самое легкое, чтобы заставить его работать во всех браузерах, - это обработать событие load в blank.htm и вызвать функцию на главной странице:

В пустой.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 
     } 
    }; 
} 
+0

прежде всего спасибо за ур усилий, я действительно apreciated, но используя код 'работает только в IE7 и Firefox'. Chrome и IE8 не работают :(Я ошибаюсь во что-то? –

+0

Нет. Я не тестировал свой код, извините. Теперь переписано. –

+0

Тим, ты отлично поработал, и я уверен, что ты потратил много времени, чтобы исправить , как и я, используя все доступные инструменты отладчика, но не повезло. Благодаря этому да, проблема заключалась в том, чтобы ждать загрузки фрейма. Я тестировал также и с Opera, и отлично работал. попробовал дать вам голосование, моя репутация я замедляю, поэтому я не могу, 'так вот мой маленький голос + 10';) –

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