IFRAME上的onkeydown crossbrowser?

时间:2010-08-25 16:34:47

标签: javascript events iframe internet-explorer-8

发布之前我尝试在此网站中搜索解决方案,并通过谷歌搜索,但现在运气不错。

我的IE8存在问题,下面这段代码即时添加了IFRAME,可以在Chrome,Firefox和IE7中正常使用。

问题是keyHandler()函数仅在IE8中未触发

将事件crossbrowser附加为onkeydown的最佳解决方案是什么?

(Safari和Opera也很好支持,这个代码也支持IE9吗?)

P.S。我目前使用 prototype.js ,嵌入的 blank.htm contenteditable on 和正确的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 个答案:

答案 0 :(得分:3)

嗯。你的代码有几个问题。

  1. 请勿使用document.all。这些日子完全是多余的。
  2. 使用addEventListener时,事件类型没有“on”前缀,因此您需要'keydown'而不是'onkeydown'。
  3. 测试您即将使用的对象,而不是根据不相关对象的存在进行推断。直接测试addEventListener
  4. Chrome和Firefox的分支是不必要的。您可以在所有最近的浏览器中使用contentWindow,虽然它是非标准的(contentDocument.defaultView是标准的)。
  5. keydown处理程序可以应用于所有浏览器中的iframe文档。
  6. 我想知道IE 8问题可能是document.all可能已被删除,但我真的不知道。自1999年以来,我没有在任何代码中使用document.all

    我遇到的另一种可能性是window.frames使用了框架的name而非ID。

    <强>更新

    道歉,我没有测试我的代码。现在测试了它,我意识到它比我记忆中的更难。在iframe文档加载之前,您无法安全地附加keydown处理程序,这使事情变得有点棘手。使其适用于所有浏览器的最简单方法是处理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
            }
        };
    }