最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一起來寫段JS drag拖動代碼

 更新時(shí)間:2010年12月09日 18:31:37   作者:  
記得幾年前剛接觸前端的時(shí)候,覺得能在網(wǎng)頁上拖移元素是一件很爽的事,能寫一段這樣的代碼是件很了不起的事情,于是乎google,baidu蠻多代碼來學(xué)習(xí),大致明白了思路,總結(jié)如下
1、為要被拖移三個(gè)事件,onmousedown,onmousemove,onmouseup
2、在onmousemove事件中來處理被拖移元素的位置的變化,其實(shí)說白了元素要移動的距離就是鼠標(biāo)兩次移動之間的距離。
3、其中還包括setCapture,releaseCapture,目的就是為了被搬移的元素始終能擁有焦點(diǎn)。
以前大致就是以前的認(rèn)識,可以參見 JS拖動技術(shù)--- 關(guān)于setCapture 這個(gè)實(shí)現(xiàn),后來隨著工作要求的提高,做的工作都是要跨瀏覽器的,所以就重新構(gòu)思并參考一些開源代碼做了實(shí)現(xiàn)。
現(xiàn)在大致思路可分析為以下幾步,我一一為您展現(xiàn)。
1、 我們是為了拖移而搬移嗎?當(dāng)然不是,如google地圖,當(dāng)每次搬移后他的目的是為了計(jì)算當(dāng)前空間坐標(biāo)來加載地理信息。所以我這里設(shè)計(jì)了幾個(gè)常見事件。以下是事件列表
onDragStart :元素發(fā)生拖移時(shí),如果注冊該事件,觸發(fā)時(shí)會接收到兩個(gè)參數(shù)x,y分別為被搬移元素發(fā)生拖移時(shí)的坐標(biāo)
onDrag : 元素拖移過程中,如果注冊該事件,觸發(fā)時(shí)會接收到兩個(gè)參數(shù)nx,ny拖移過程中坐標(biāo)發(fā)生的偏移量
onDragEnd :元素發(fā)生結(jié)束時(shí),如果注冊該事件,觸發(fā)時(shí)會接收到兩個(gè)參數(shù)x,y分別為被搬移元素的當(dāng)前坐標(biāo)
2、 onmousedown事件應(yīng)該綁定給誰?以前我都是綁定給被拖移元素的,后來發(fā)現(xiàn)很不靈活,現(xiàn)在設(shè)計(jì)為可綁定給任意不相關(guān)的元素同時(shí)實(shí)現(xiàn)該元素的拖動。
3、 如何來實(shí)現(xiàn)元素搬移過程中一直擁有焦點(diǎn)?因?yàn)橐鐬g覽器,所以就不再用setCapture之類的方法,這里換種思維,為什么元素元素搬移過程中沒有了焦點(diǎn)呢,主要是我們把onmousemove事件注冊到了被拖移的元素上,而這并不是必需的,所以當(dāng)元素觸發(fā)onmousedown事件后,我把onmousemove、onmouseup事件直接注冊到document上,這樣鼠標(biāo)移到哪都會有焦點(diǎn)。
說完了這么多,直接看代碼結(jié)構(gòu)吧!
復(fù)制代碼 代碼如下:

Drag = {
obj: null,
init: function (options) {
options.handler.onmousedown = this.start;
options.handler.root = options.root || options.handler;
var root = options.handler.root;
root.onDragStart = options.dragStart || new Function();
root.onDrag = options.onDrag || new Function();
root.onDragEnd = options.onDragEnd || new Function();
},
start: function (e) {//此時(shí)的this是handler
var obj = Drag.obj = this;
obj.style.cursor = 'move';
e = e || Drag.fixEvent(window.event);
ex = e.pageX;
ey = e.pageY;
obj.lastMouseX = ex;
obj.lastMouseY = ey;
var x = obj.root.offsetLeft;
var y = obj.root..offsetTop;
obj.root.style.left = x + "px";
obj.root.style.top = y + "px";
document.onmouseup = Drag.end;
document.onmousemove = Drag.drag;
obj.root.onDragStart(x, y);
},
drag: function (e) {
e = e || Drag.fixEvent(window.event);
ex = e.pageX;
ey = e.pageY;
var root = Drag.obj.root;
var x = root.style.left ? parseInt(root.style.left) : 0;
var y = root.style.top ? parseInt(root.style.top) : 0;
var nx = ex - Drag.obj.lastMouseX + x;
var ny = ey - Drag.obj.lastMouseY + y;
root.style.left = nx + "px";
root.style.top = ny + "px";
Drag.obj.root.onDrag(nx, ny);
Drag.obj.lastMouseX = ex;
Drag.obj.lastMouseY = ey;
},
end: function (e) {
var x = Drag.obj.root.style.left ? parseInt(Drag.obj.root.style.left) : 0;
var y = Drag.obj.root.style.top ? parseInt(Drag.obj.root.style.top) : 0;
Drag.obj.root.onDragEnd(x, y);
document.onmousemove = null;
document.onmouseup = null;
Drag.obj = null;
},
fixEvent: function (e) {
e.pageX = e.clientX + document.documentElement.scrollLeft;
e.pageY = e.clientY + document.documentElement.scrollTop;
return e;
}
}

上面init主要處理一些初如化工作,如記錄onDragStart、onDrag、onDragEnd三個(gè)事件, handler為處理拖動事件的那個(gè)元素,root為被拖動的元素。
當(dāng)在handler上點(diǎn)擊后觸發(fā)Drag.start方法,Drag.start主要為記錄住鼠標(biāo)相對整個(gè)頁面的位置;給document注冊onmouseup、onmousemove事件,及觸發(fā)onDragStart事件。
Drag.drag方法也很簡單,主要作用就是更新被搬移元素位置,同時(shí)記錄住鼠標(biāo)相對整個(gè)頁面的位置。
Drag.end方法就更簡單了,就是做一些收尾工作。

最后給大家附段使用的代碼吧,祝大家學(xué)習(xí)愉快!
復(fù)制代碼 代碼如下:

Drag.init({
handler: document.getElementById("handler"),
root:document.getElementById("root");
});
<div id="root">
<h2 id="handler"></h2>
</div>

相關(guān)文章

  • 12種JavaScript常用的MVC框架比較分析

    12種JavaScript常用的MVC框架比較分析

    這篇文章主要介紹了12種JavaScript常用的MVC框架比較分析,以獨(dú)特的視角分析了12中常見的JavaScript MVC框架各種優(yōu)缺點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • js判斷radiobuttonlist的選中值顯示/隱藏其它模塊的實(shí)現(xiàn)方法

    js判斷radiobuttonlist的選中值顯示/隱藏其它模塊的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s判斷radiobuttonlist的選中值顯示/隱藏其它模塊的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • Es6 Generator函數(shù)詳細(xì)解析

    Es6 Generator函數(shù)詳細(xì)解析

    Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同。這篇文章給大家介紹Es6 Generator函數(shù)的相關(guān)知識,感興趣的朋友一起看看吧
    2018-02-02
  • 常用的js驗(yàn)證和數(shù)據(jù)處理總結(jié)

    常用的js驗(yàn)證和數(shù)據(jù)處理總結(jié)

    遇到需要對數(shù)據(jù)及表單驗(yàn)證的,我相信大家都像我一樣,喜歡在網(wǎng)上找相關(guān)的方法,因?yàn)樽约簩懙脑?,是比較耗時(shí)的。今天就給大家分享一下,自己在工作中總結(jié)的一些常用的js。
    2016-08-08
  • 淺析JavaScript中作用域和作用域鏈

    淺析JavaScript中作用域和作用域鏈

    本文主要介紹了JavaScript中作用域和作用域鏈解析,條理分明,方便理解,這里推薦給小伙伴們,有需要的朋友可以參考下
    2016-12-12
  • setTimeout與setInterval在不同瀏覽器下的差異

    setTimeout與setInterval在不同瀏覽器下的差異

    setTimeout與setInterval是window對象的兩個(gè)非常神奇方法,用于實(shí)現(xiàn)定時(shí)或延時(shí)調(diào)用一個(gè)函數(shù)或一段代碼
    2010-01-01
  • Postman的FormData傳參的使用示例詳解

    Postman的FormData傳參的使用示例詳解

    今年上半年因?yàn)樽霎呍O(shè)的原因,有自己接觸到后端,也是用過了postman去測試接口,看到了postman那邊的參數(shù)形式,一直對這個(gè)formData有想法,今天通過本文給大家介紹Postman的FormData傳參的使用,感興趣的朋友一起看看吧
    2023-10-10
  • Javascript中的for in循環(huán)和hasOwnProperty結(jié)合使用

    Javascript中的for in循環(huán)和hasOwnProperty結(jié)合使用

    當(dāng)檢測某個(gè)對象是否擁有某個(gè)屬性時(shí),hasOwnProperty 是唯一可以完成這一任務(wù)的方法,在 for in 循環(huán)時(shí),建議增加 hasOwnProperty 進(jìn)行判斷,可以有效避免擴(kuò)展本地原型而引起的錯(cuò)誤
    2013-06-06
  • 在html頁面上拖放移動標(biāo)簽

    在html頁面上拖放移動標(biāo)簽

    在html頁面上拖放移動標(biāo)簽,需要的朋友可以參考下。
    2010-01-01
  • 淺析如何在Bash中調(diào)用Node運(yùn)行JS文件進(jìn)行數(shù)據(jù)通信

    淺析如何在Bash中調(diào)用Node運(yùn)行JS文件進(jìn)行數(shù)據(jù)通信

    這篇文章主要來和大家探討在 Bash 中調(diào)用 Node 運(yùn)行 JS 文件時(shí)如何進(jìn)行數(shù)據(jù)通信,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03

最新評論

嘉义县| 久治县| 华阴市| 苗栗县| 云和县| 揭东县| 浦东新区| 聂拉木县| 濉溪县| 淮滨县| 屯昌县| 临安市| 石狮市| 历史| 尉犁县| 凤城市| 沭阳县| 长乐市| 蓬莱市| 郯城县| 泰和县| 锡林浩特市| 尼木县| 安陆市| 阜阳市| 鄂托克旗| 电白县| 留坝县| 北流市| 交口县| 乐都县| 资源县| 汉川市| 鲜城| 武城县| 岐山县| 象州县| 拜城县| 盐城市| 平武县| 巨鹿县|