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

          常用鏈接

          留言簿

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

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

           

          簡單的代碼如下(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">
              // 全局變量,記錄鼠標(biāo)指針的上一次位置
              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";
                  //鎖定鼠標(biāo)事件
                  theObj.setCapture();
                }
                return true;
              }
              function mymousemove(theObj) {
                if (event.button == 1) {
                  //計算鼠標(biāo)指針的移動量
                  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) {
                  //放開鼠標(biāo)事件
                  theObj.releaseCapture();
                  theObj.style.cursor="default";
                }
                return true;
              }
              //在寫JavaScript代碼時,我通常加入一個文本區(qū)域來進(jìn)行調(diào)試
              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,因?yàn)閜osition屬性默認(rèn)是static,在這種情況下,對象的left和top屬性會被CSS解釋器忽略。

          另外,在網(wǎng)上看到有同仁說:

          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中兼容,就需要進(jìn)行不同的處理了。

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 平安县| 沁水县| 岱山县| 民勤县| 香格里拉县| 蓝田县| 夏津县| 焉耆| 南丹县| 读书| 平安县| 泰州市| 金乡县| 塔河县| 宣城市| 石景山区| 斗六市| 盐源县| 邵阳县| 乌拉特中旗| 霍邱县| 英吉沙县| 新建县| 铁岭市| 八宿县| 万年县| 清涧县| 盱眙县| 天峨县| 克拉玛依市| 册亨县| 星座| 安福县| 新兴县| 吉木萨尔县| 饶河县| 吉安市| 锦州市| 扎赉特旗| 高淳县| 扶余县|