题
我有个页面 document.onkeydown
事件处理程序,并且我加载内部的一个框架,在另一页。我必须点击的内部框架,以得到的内容页开始"听"。
是否有某种方式我可以使用JavaScript在外页面设置的重点内页面,所以我不必击框架?
编辑:应对评论意见:
下文是主要的窗口是一个光-盒子-就像系统,除了而不是照片,显示了内部框架,并且每个框架是一个互动的网页与表示/鼠标.这些处理程序不火,直到我击在该框架之后表示的光箱的事情。
我不是实际上看到"setFocus"在传统意义上的一样多"启动事件的处理程序的框架如果要"
解决方案
我与jQuery的ThickBox的(一个收藏式对话窗口小部件)类似的问题。我已修正问题的方式如下:
function setFocusThickboxIframe() {
var iframe = $("#TB_iframeContent")[0];
iframe.contentWindow.focus();
}
$(document).ready(function(){
$("#id_cmd_open").click(function(){
/*
run thickbox code here to open lightbox,
like tb_show("google this!", "http://www.google.com");
*/
setTimeout(setFocusThickboxIframe, 100);
return false;
});
});
代码似乎并不没有setTimeout的工作()。根据我的测试,它工作在火狐3.5,Safari4的,Chrome4浏览器,IE7和IE6。
其他提示
使用contentWindow.focus()的方法,该超时是可能需要等待的IFRAME是完全加载。
对我来说,也使用属性onload="this.contentWindow.focus()"
作品,用Firefox,进iframe标签
document.getElementsByName("iframe_name")[0].contentWindow.document.body.focus();
尝试侦听该父文档中的事件和传递该事件处理程序的iframe文档中
我不得不其中i是试图把重点放在一个txt区域在从另一页加载的iframe类似的问题。在大多数情况下,它的工作。有其中的iFrame被加载时,它会火在FF的问题,但在此之前它是可见的。所以重点似乎从未正确设置。
我的工作解决此与simular解决cheeming的回答上述
var iframeID = document.getElementById("modalIFrame");
//focus the IFRAME element
$(iframeID).focus();
//use JQuery to find the control in the IFRAME and set focus
$(iframeID).contents().find("#emailTxt").focus();
我发现,FF触发对于iframe.contentWindow但不能用于iframe.contentWindow.document焦点事件。 Chrome浏览器的例子可以处理这两种情况。所以,我只需要绑定我的事件处理程序来iframe.contentWindow为了把事情的工作。 也许这可以帮助别人...
这里是代码,以创建一个框架使用jQuery追加它的文件,调查它直到它被装载,那么重点。这比设置任意的超时可以或不能运作取决于如何长期的框架需要加载。
var jqueryIframe = $('<iframe>', {
src: "http://example.com"
}),
focusWhenReady = function(){
var iframe = jqueryIframe[0],
doc = iframe.contentDocument || iframe.contentWindow.document;
if (doc.readyState == "complete") {
iframe.contentWindow.focus();
} else {
setTimeout(focusWhenReady, 100)
}
}
$(document).append(jqueryIframe);
setTimeout(focusWhenReady, 10);
代码,用于检测当的框架是装的是适从 Biranchi's答案 如何检查,如果框架是装载或者它有一个内容?
这是一种适合我的工作,但它闻起来有点不对劲:
var iframe = ...
var doc = iframe.contentDocument;
var i = doc.createElement('input');
i.style.display = 'none';
doc.body.appendChild(i);
i.focus();
doc.body.removeChild(i);
嗯。它也滚动到内容的底部。我想我应该插入顶部的虚拟文本框。