1. 程式人生 > >frameset 將截斷鍵盤和滑鼠事件的問題解決辦法

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) {}
       }
   }