<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 閱讀(3806) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 久久水蜜桃亚洲AV无码精品| 亚洲人成图片小说网站| 亚洲黄色在线视频| a毛片在线免费观看| 久久久久久久综合日本亚洲| 国产99视频精品免费视频76| 亚洲中文字幕无码一区| 一级毛片免费播放男男| 2048亚洲精品国产| 中文无码日韩欧免费视频| 亚洲熟妇中文字幕五十中出| av片在线观看永久免费| 国产亚洲AV手机在线观看| 波霸在线精品视频免费观看| 国产亚洲精品国产| 日韩在线永久免费播放| 亚洲综合激情另类小说区| 999国内精品永久免费观看| 中文字幕亚洲综合久久综合 | 亚洲经典千人经典日产| 麻豆国产VA免费精品高清在线| 亚洲av成人片在线观看| 免费女人18毛片a级毛片视频| 精品久久久久久无码免费| 亚洲VA中文字幕无码一二三区 | 国产va免费精品观看精品| 最新亚洲精品国偷自产在线| 四虎AV永久在线精品免费观看| 一本岛v免费不卡一二三区| 亚洲AV无码一区东京热久久| 免费成人激情视频| 亚洲人成人无码.www石榴| 亚洲成AV人网址| 三年片在线观看免费大全电影| 亚洲xxxx视频| 中文字幕精品亚洲无线码二区| 99ee6热久久免费精品6| 亚洲色丰满少妇高潮18p| 国产亚洲欧洲Aⅴ综合一区| 18观看免费永久视频| 美国免费高清一级毛片|