如何跨多个帧捕获一个onkeyevent&子

时间:2010-10-17 15:40:01

标签: javascript jquery iframe

我正在处理一个使用框架和框架的ball-of-mudd项目。 iframe创建一个“可自定义”的界面(就像人们在2002年所做的那样)。

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

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

任何帮助表示感谢;对于因重复最后一段太多次而导致的nausia,我不承担任何责任。 :)

3 个答案:

答案 0 :(得分: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));
};

答案 1 :(得分: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文档。

当然,你可以做得更复杂,但这是基本的想法。在您的情况下,您将不得不处理不同的事件。

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

答案 2 :(得分: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();
  }

 };

}();