我如何在多个帧和子帧中捕获一个onkeyevent
我正在处理一个ball-of-mudd项目,该项目使用iframes创建一个“可定制”界面(就像人们在2002年所做的那样)使用框架&。我如何在多个帧和子帧中捕获一个onkeyevent
该应用程序在hta之内运行,并且模拟真实的WPF样式应用程序。我需要捕获密钥,以便我可以选择性地更改/刷新一些子帧。
我想要做的是,如果有一个叫做桌面的子子框架,并且它有一些框架,我将如何在所有框架中安全地捕获一个事件;刷新帧子帧?
任何帮助赞赏;对于最后一段重复次数太多而导致的索赔,我不承担任何责任。 :)
工作;使用调用自己的函数在循环中挖掘帧;我将它限制在8个,而我知道它最深。你总是可以自己改变它。
var XXX_util_keyboard = function()
{
//"private" variables:
var objTopWindow = top.window.frames,
arrFrames = [],
MaxDepth = 8;
//"private" methods:
var AddToArray = function(obj){
if(typeof obj.document != "undefined") {
arrFrames.push(obj);
return true;
}
return false;
};
var DeleteFromArray = function(obj){
if(typeof obj != "undefined") {
arrFrames.splice(arrFrames.indexOf(obj), 1);
return true;
}
return false;
};
var FrameLoop = function(objFrames){
if(MaxDepth > 0){
if(objFrames !== null)
{
for(var k = 0; k < objFrames.frames.length; k++)
{
var tmp = objFrames.frames[k];
AddToArray(tmp);
FrameLoop(tmp);
}
this.MaxDepth--;
}
}
};
var AttachEvent = function(key, fn) {
for(var i = 0; i < arrFrames.length; i++){
arrFrames[i].document.onkeypress = function(e) {
var evt = e || window.event,
charCode;
if(evt === null){ evt = this.parentWindow.event; /*IE doesnt capture scope correctly*/ }
charCode = evt.keyCode || evt.which;
alert(charCode);
evt.cancelBubble = true;
if (evt.stopPropagation){ evt.stopPropagation();}
};
}
};
return {
init: function()
{
AddToArray(this.getTopWindow()[0]);
FrameLoop(this.getTopWindow()[0]);
},
getFrames: function()
{
if(arrFrames.length < 1){ FrameLoop(objTopWindow[0]); }
return arrFrames;
},
getTopWindow: function()
{
return objTopWindow === undefined ? window.frames : objTopWindow.window.frames;
},
attachEvent: function()
{
if(arrFrames.length < 1){ FrameLoop(objTopWindow[0]); }
AttachEvent();
}
};
}();
我不知道什么HTA,但问题被标记为使用Javascript/jQuery的/ iframe的,所以我想这是没有问题的......
您可以使用一个对象在window.top中集中管理你的事件。
在主窗口中,您使用类似:
var getTopObject = function() {
return window.top.topObject;
}
var TopClass = function() {
this.processClick = function (frame) {
//do something...
alert('click in ' + frame.document.location.toString());
var msj = frame.document.getElementById("msj");
msj.innerHTML = "change!";
};
}
window.top.topObject = new TopClass();
然后,在每一个IFRAME,你就把:
window.onclick = function() { getTopObject().processClick(window); };
你收到此通知的单击事件的这种方式。 另请注意,在示例中的'processClick'函数内部,您可以访问iframe文档。
当然,你可以做到这一点更复杂,但这是基本的想法。你将不得不在你的案件中处理不同的事件。
希望这会有所帮助,对不起我的英语!
接听拿到格式
arrFrames[i].document.onkeypress = function(){
var evtobj = window.event ? event : e;
evtobj.cancelBubble = true;
if (evtobj.stopPropagation){ evtobj.stopPropagation();}
top.console.log(evtobj.type+' - '+(evtobj.which?evtobj.which:evtobj.keyCode));
};
Ta;编号只是意识到在我看到另一篇文章后版本中的错误(http://stackoverflow.com/questions/1629926/element-onkeydown-keycode-javascript)临时性脑损伤 – 2010-10-25 19:18:54
我试图通过DOM树滚动,作为“桌面”这样做有一个可变数目的I帧。痛苦不覆盖它 – 2010-10-22 12:35:59
我不明白是什么问题...你能更具体吗? – Pato 2010-10-22 15:28:24
框内有框架(最深可达7处) – 2010-10-25 19:05:15