发布之前我尝试在此网站中搜索解决方案,并通过谷歌搜索,但现在运气不错。
我的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);
}
}
答案 0 :(得分:3)
嗯。你的代码有几个问题。
document.all
。这些日子完全是多余的。addEventListener
时,事件类型没有“on”前缀,因此您需要'keydown'而不是'onkeydown'。addEventListener
。contentWindow
,虽然它是非标准的(contentDocument.defaultView
是标准的)。keydown
处理程序可以应用于所有浏览器中的iframe文档。我想知道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
}
};
}