2010-10-17 45 views
1

我正在处理一个ball-of-mudd项目,该项目使用iframes创建一个“可定制”界面(就像人们在2002年所做的那样)使用框架&。我如何在多个帧和子帧中捕获一个onkeyevent

该应用程序在hta之内运行,并且模拟真实的WPF​​样式应用程序。我需要捕获密钥,以便我可以选择性地更改/刷新一些子帧。

我想要做的是,如果有一个叫做桌面的子子框架,并且它有一些框架,我将如何在所有框架中安全地捕获一个事件;刷新帧子帧?

任何帮助赞赏;对于最后一段重复次数太多而导致的索赔,我不承担任何责任。 :)

回答

0

工作;使用调用自己的函数在循环中挖掘帧;我将它限制在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(); 
    } 

}; 

}(); 
0

我不知道什么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文档。

当然,你可以做到这一点更复杂,但这是基本的想法。你将不得不在你的案件中处理不同的事件。

希望这会有所帮助,对不起我的英语!

+0

我试图通过DOM树滚动,作为“桌面”这样做有一个可变数目的I帧。痛苦不覆盖它 – 2010-10-22 12:35:59

+0

我不明白是什么问题...你能更具体吗? – Pato 2010-10-22 15:28:24

+0

框内有框架(最深可达7处) – 2010-10-25 19:05:15

1

接听拿到格式

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)); 
}; 
+0

Ta;编号只是意识到在我看到另一篇文章后版本中的错误(http://stackoverflow.com/questions/1629926/element-onkeydown-keycode-javascript)临时性脑损伤 – 2010-10-25 19:18:54