<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 42  文章 - 71  trackbacks - 0
    <2008年4月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    最近在搞VML的東東。做了一個簡單的在HTML頁面上畫出流程圖的功能。

    既然是畫圖,就肯定遇到在頁面上拖動圖畫元素的功能。這個大家都會覺得很簡單了,無非就是mousedown, mousemove, mouseup這些事件的組合了。但是如果只是這么簡單的編寫代碼的話,當頁面上元素都有自己的mousedown, mousemove, mouseup時,在拖動的時候就會受到干擾。根據原來開發VB程序的經驗,我覺得應該有一種方式能夠將事件暫時鎖定到一個對象。翻翻資料,看到了兩個方法:setCapture和releaseCapture,哈哈,和Win32 API的函數名稱都一樣。setCapture函數的作用就是將后續的mouse事件都發送給這個對象,releaseCapture就是將鼠標事件還回去,由document、window、object之類的自行來處理,這樣就保證了在拖動的過程中,不會由于經過了其它的元素而受到干擾。另外,還有一個很重要的事情是,在Win32上,mouse move的事件不是一個連續的,也就是說,并不是我們每次移動1px的鼠標指針,就會發生一個mousemove,windows會周期性檢查mouse的位置變化來產生mousemove的事件。所以,如果是一個很小的頁面對象,比如一個直徑5px的圓點,如果沒有setCapture和releaseCapture,那么在鼠標按住之后,快速的移動鼠標,就有可能鼠標移動走了,但是小圓點還在原地,就是因為下一次的mousemove事件已經不再發給這個圓點對象了。

     

    簡單的代碼如下(WindowsXP SP2 + IE 6 測試):

     

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      <meta http-equiv="content-type" content="text/html; charset=windows-1250">
      <meta name="generator" content="PSPad editor, www.pspad.com">
      <title>HTML Mouse Drag Move</title>
      <script language="javascript">
        // 全局變量,記錄鼠標指針的上一次位置
        var g_x;
        var g_y;
        function mymousedown(theObj) {
          if (event.button == 1) {
            g_x = event.clientX;
            g_y = event.clientY;
            theObj.style.cursor = "move";
            //鎖定鼠標事件
            theObj.setCapture();
          }
          return true;
        }
        function mymousemove(theObj) {
          if (event.button == 1) {
            //計算鼠標指針的移動量
            var deltaX = event.clientX - g_x;
            var deltaY = event.clientY - g_y;
            g_x = event.clientX;
            g_y = event.clientY;
            theObj.style.pixelLeft += deltaX;
            theObj.style.pixelTop += deltaY;
          }
          return true;
        }
        function mymouseup(theObj) {
          if (event.button == 1) {
            //放開鼠標事件
            theObj.releaseCapture();
            theObj.style.cursor="default";
          }
          return true;
        }
        //在寫JavaScript代碼時,我通常加入一個文本區域來進行調試
        function debugInfo(info) {
          var debugWindow = document.getElementById("debug_window");
          debugWindow.value = debugWindow.value + "\r\n" + info;
       }
      </script>
      </head>
      <body>
        <div id="div1" style="border:1px solid black; position:absolute; top:10; left:10; width:100; height:100; background:red"
             onmousedown="mymousedown(this)"
             onmousemove="mymousemove(this)"
             onmouseup="mymouseup(this)">
             Hello world!
        </div>
        <br><br><br><br><br><br>
        <textarea id="debug_window" name="textarea" cols="50" rows="20"></textarea>
      </body>
    </html>

    注:要移動的對象的style中position屬性一定要指定為absolute或者relative,因為position屬性默認是static,在這種情況下,對象的left和top屬性會被CSS解釋器忽略。

    另外,在網上看到有同仁說:

    Mozilla 也有類似的功能,方法稍微不同 
      window.captureEvents(Event.eventType) 
       window.releaseEvents(Event.eventType)
    Event 是Mozilla特殊的一個object. 
    eventType 包括: Abort, Blur, Click, Change, DblClick, DragDrop, Error, Focus, KeyDown, KeyPress, KeyUp, Load, MouseDown

    如果要在Mozilla中兼容,就需要進行不同的處理了。

    posted on 2008-04-16 15:32 YODA 閱讀(3807) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲视频在线观看网址| 亚洲va久久久噜噜噜久久男同| 久久久婷婷五月亚洲97号色| 好紧我太爽了视频免费国产| 国产亚洲精品激情都市| xxxxx做受大片在线观看免费| 亚洲av中文无码| 人妻巨大乳hd免费看| 亚洲а∨天堂久久精品| 一级做a爰全过程免费视频毛片| 亚洲视频一区二区| 成人久久免费网站| 亚洲一区二区三区日本久久九| 99久9在线|免费| 亚洲国产中文在线视频| 18禁成年无码免费网站无遮挡| 久久水蜜桃亚洲AV无码精品| 免费一级毛片不卡在线播放| 九九九精品视频免费| 亚洲AV永久无码区成人网站 | 女人裸身j部免费视频无遮挡| 亚洲人成电影网站国产精品| APP在线免费观看视频| 色播亚洲视频在线观看| 日韩精品福利片午夜免费观着| 亚洲成a∨人片在无码2023| 国产亚洲日韩在线三区| 亚欧日韩毛片在线看免费网站| 亚洲AV综合色区无码二区偷拍| 国产精品无码一区二区三区免费| 一本岛v免费不卡一二三区| 亚洲毛片在线观看| 国内一级一级毛片a免费| 久久国产一片免费观看| 亚洲精彩视频在线观看| 免费大黄网站在线观看| 6080午夜一级毛片免费看| 春暖花开亚洲性无区一区二区 | 黄 色一级 成 人网站免费| 亚洲高清中文字幕综合网| 日韩一级免费视频|