Как захватить событие onkeye в нескольких кадрах и подкадрах - PullRequest
1 голос
/ 17 октября 2010

Я имею в виду проект ball-of-mud , в котором для создания «настраиваемого» интерфейса используются фреймы и рамки (как это делали люди в 2002 году).

Приложение запускается из hta и эмулирует настоящее приложение в стиле WPF.Мне нужно захватывать ключи, чтобы я мог выборочно изменять / обновлять некоторые подкадры.

Я пытаюсь сделать это, если был подкадр, называемый рабочим столом, и в котором были некоторые кадрыя бы запечатлел событие безопасно во всех кадрах;и обновить кадры подкадров?

Любая помощь приветствуется;Я не несу ответственности за наусию, вызванную повторением последнего абзаца слишком много раз.:)

Ответы [ 3 ]

1 голос
/ 25 октября 2010

Отвечая, чтобы получить форматирование

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 голосов
/ 25 октября 2010

Рабочая;копает кадры в цикле, используя функцию, вызывающую себя;Я ограничил его до 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 голосов
/ 22 октября 2010

Я ничего не знаю о 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();

И затем, на каждом фрейме вставляете:

window.onclick = function () { getTopObject().processClick(window); };

Таким образом, вы получите уведомление о событии клика.Также обратите внимание, что внутри функции processClick в этом примере вы можете получить доступ к документу iframe.

Конечно, вы можете сделать это намного сложнее, но это основная идея.Вам придется иметь дело с различными событиями в вашем случае.

Надеюсь, это поможет, и извините за мой английский!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...