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

          常用鏈接

          留言簿

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

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

           

          簡單的代碼如下(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代碼時,我通常加入一個文本區(qū)域來進行調(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,因為position屬性默認是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中兼容,就需要進行不同的處理了。

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 榕江县| 昌都县| 闻喜县| 道真| 鹤山市| 奇台县| 丹棱县| 伊川县| 西充县| 靖宇县| 方城县| 宣化县| 玛沁县| 呼图壁县| 乌鲁木齐市| 修武县| 古浪县| 盖州市| 铁力市| 鄂伦春自治旗| 大田县| 海阳市| 大埔区| 永定县| 石城县| 平阳县| 扶余县| 登封市| 汉川市| 镇坪县| 武功县| 沾益县| 浑源县| 洛扎县| 措勤县| 大新县| 合阳县| 饶河县| 山阴县| 绥滨县| 长兴县|