2010-10-17 36 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