frameset 將截斷鍵盤和滑鼠事件的問題解決辦法
最近發現一個網頁程式的Bug, 我的 主頁面引用了一個 IFrame, 而IFrame裡面有 Frameset 的兩個Frame. 主頁面是有滾動條的, 但是在 FrameSet 的 frame獲得焦點時, 無法將鍵盤(上,下鍵)或者滑鼠中鍵訊息傳遞給 主頁面, 導致無法操作滾動條.
在網路上找了半天,都沒有找到解決辦法, 最後還是自已動手, 解決了這個問題.
處理方式是:
1: 針對frameset 中的每個frame註冊鍵盤和滑鼠中鍵的事件.
2: 在事件中, 強行對外層頁面進行滾動操作.
相關程式碼是:
//註冊滾動事件
function registerScroll() {
try {
//需要滾動的窗體,對於我的應用,固定為以下窗體
//如果針對其它門戶,需要進行修改或改為引數傳遞
var scrollWindows = top.frames(0);
for(var i = 0; i < frames.length; i++) {
var h = new ScrollHandle(i,scrollWindows);
frames[i].document.attachEvent("onkeydown",h.keyDownhandle);
frames[i].document.attachEvent("onmousewheel",h.wheelHandle);
}
}catch(err){}
}
/**
* 強制滾動指定的窗體
*/
function ScrollHandle(index,scrollWindows) {
this.keyDownhandle = function()
{
try {
var keyCode = frames[index].event.keyCode;
if (keyCode == 40) //下鍵
scrollWindows.document.body.doScroll("scrollbarDown");
else if(keyCode == 38) //上鍵
scrollWindows.document.body.doScroll("scrollbarUp");
else if(keyCode == 37) //左鍵
scrollWindows.document.body.doScroll("scrollbarLeft");
else if(keyCode == 39) //右鍵
scrollWindows.document.body.doScroll("scrollbarRight");
//else 其它鍵暫時不做處理
} catch (err){}
}
this.wheelHandle = function()
{
try {
var wheelDelta = frames[index].event.wheelDelta;
if (wheelDelta >= 120) //上滾
scrollWindows.document.body.doScroll("scrollbarUp");
else if (wheelDelta <= -120) //下滾
scrollWindows.document.body.doScroll("scrollbarDown");
} catch (err) {}
}
}