開(kāi)始了蕾羊,現(xiàn)在的征途是面向?qū)ο?/h1>

前些天在某博客看到使用js實(shí)現(xiàn)窗口拖拽空凸,果然一臉懵逼的進(jìn)去较解,一臉懵逼的出來(lái)畜疾,今天就學(xué)習(xí)了拖拽事件(表示我的內(nèi)心開(kāi)始是拒絕的
以下是實(shí)現(xiàn)代碼(這次是全的)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>拖拽事件</title>
  <style>
  #box{
    width:100px;
    height:100px;
    background:red;
    position:absolute;
    cursor: move;//個(gè)人喜好,當(dāng)鼠標(biāo)移動(dòng)到可拖拽位置時(shí)顯示為十字形(請(qǐng)?jiān)贗E6以上嘗試)
  }
  </style>
</head>
<body>
  <div id="box" ></div>
  <script>
    var oBox=document.getElementById("box");
    oBox.onmousedown=function(e1){
      e1.preventDefault();                 //阻止瀏覽器的默認(rèn)行為
      var dX=e1.clientX-oBox.offsetLeft;  //點(diǎn)擊位置距元素邊緣的位置
      var dY=e1.clientY-oBox.offsetTop;  //點(diǎn)擊位置距元素邊緣的位置
      window.onmousemove=function(e2){
          oBox.style.left=e2.clientX-dX+"px";  //拖拽過(guò)程中l(wèi)eft值的實(shí)際變化量
          oBox.style.top=e2.clientY-dY+"px";  //拖拽過(guò)程中top值的實(shí)際變化量
      }
      oBox.onmouseup=function(){              
        window.onmousemove=null;//也可以寫(xiě)成window.onmousemove=""
//清空onmousemove哨坪,相對(duì)于鼠標(biāo)移動(dòng)事件處理函數(shù)為空
      }//鼠標(biāo)抬起事件
    }
  </script>
</body>
</html>

值得一提的是我們傳入的參數(shù)e1e2,他們都是對(duì)象(這只是代碼庸疾,這只是代碼),而系統(tǒng)給了我們兩個(gè)相當(dāng)有用的工具:
e.stopPropagation()阻止事件流(取消冒泡)当编,IE不支持該方法
window.event.cancelBubble = true 這是IE瀏覽器中阻止事件流的方法
e.preventDefault()阻止瀏覽器默認(rèn)行為届慈,IE同樣不支持該方法
window.event.returnValue = false;這是IE瀏覽器中阻止事件流的方法


當(dāng)然,事情沒(méi)有那么簡(jiǎn)單忿偷,如果在一個(gè)頁(yè)面中可以拖動(dòng)的元素有很多該怎么辦金顿,總不至于再寫(xiě)一個(gè)函數(shù)吧。當(dāng)然不用鲤桥,不然我也不會(huì)寫(xiě)這篇文章揍拆。這就需要我們今天的主角面向?qū)ο?/strong>登場(chǎng)(此處略)。


雖然使用面向?qū)ο髮?xiě)js有點(diǎn)暈茶凳,但是萬(wàn)變不離其宗嫂拴,也就是我們上面那一堆代碼。
這里是面向?qū)ο蟮耐献录a:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>面向?qū)ο蟮耐献录?lt;/title>
  <style>
    *{
      margin: 0;padding: 0;
    }
  </style>
</head>
<body>
  ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507732746115&di=53e5cb6702ade05a6cca71fa6086f6dc&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Fface%2F04a4343a0aa90d934344bce554d3d18063fa5e24.jpg)
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1508328441&di=a731e1aaa817232f2acafb20e867439e&imgtype=jpg&er=1&src=http%3A%2F%2Fwww.1688wan.com%2Fallimgs%2Fimage%2F2015%2F11%2F27%2F20151127163630_195.jpg)
  <script>
    function Fly(imgId){
      this.ele=document.getElementById(imgId);
      var self=this;
      this.ele.onmousedown=function(e){
        e.preventDefault();
        self.detaX=e.clientX-self.ele.offsetLeft;
        self.detaY=e.clientY-self.ele.offsetTop;
        self.start();
        document.onmouseup=function(){
          self.stop();
        }
      }
      this.start=function(){
        document.onmousemove=function(e){
          var x=e.clientX-self.detaX;
          var y=e.clientY-self.detaY;
          self.move(x,y)
        }
      }
      this.move=function(x,y){
        self.ele.style.left=x+"px";
        self.ele.style.top=y+"px";
      }
      this.stop=function(){
        document.onmousemove=null;
      }
    }
    new Fly("gudazi");
    new Fly("shengbei")
  </script>
</body>
</html>

果然代碼塊對(duì)于我還是太難了贮喧,還是一步一步來(lái)吧筒狠。


首先,我們的構(gòu)建一個(gè)對(duì)象吧
function Fly(){}這就是構(gòu)建的對(duì)象(其實(shí)就是函數(shù),但函數(shù)名首字母一定要大寫(xiě))
我們還得獲得元素吧
function Fly(imgId){ this.ele=document.getElementById(imgId); }這里我們向?qū)ο笾袀魅雲(yún)?shù)箱沦,以便我們?nèi)蘸罂刂贫鄠€(gè)元素
我們還得保證對(duì)對(duì)象的可控

function Fly(imgId){
  this.ele=document.getElementById(imgId);
  var self=this;
}

this只在對(duì)象中表示我們操控的元素辩恼,但是對(duì)象的函數(shù)中需要一個(gè)新的表示。
接下來(lái)就是重點(diǎn)了谓形,這個(gè)對(duì)象所具有的功能灶伊,也就是函數(shù):
思考1:這個(gè)被移動(dòng)的東西需要什么事件觸發(fā),onmusedown也就有了

function Fly(imgId){
  this.ele=document.getElementById(imgId);
  var self=this;
  this.ele.onmusedown=function(e){}
}

終于看到一個(gè)眼熟的了寒跳,不涉及其他函數(shù)的東西我們就都可以往里面填了

function Fly(imgId){
  this.ele=document.getElementById(imgId);
  var self=this;
  this.ele.onmusedown=function(e){
      e1.preventDefault();                 
      var dX=e1.clientX-oBox.offsetLeft;  
      var dY=e1.clientY-oBox.offsetTop;
  }
}

思考2:這個(gè)被移動(dòng)的物體上總共有哪些事件聘萨,
1.觸發(fā)條件onmusedown
2.在持續(xù)觸發(fā)狀態(tài)下的onmousemove童太;
3.停止觸發(fā)onmouseup;
其中onmusedownonmouseup互不干擾(你不可能即按下鼠標(biāo)左鍵又抬起鼠標(biāo)左鍵)米辐。也就是說(shuō)碾牌,onmouseup事件函數(shù)也能往里面塞:

function Fly(imgId){
  this.ele=document.getElementById(imgId);
  var self=this;
  this.ele.onmusedown=function(e){
      e1.preventDefault();                 
      var dX=e1.clientX-oBox.offsetLeft;  
      var dY=e1.clientY-oBox.offsetTop;
  this.ele.onmouseup=function(){              
        window.onmousemove=null;
      }
  }
}

接下來(lái)就剩下移動(dòng)過(guò)程了,由于移動(dòng)的范圍在window中我們不妨設(shè)置這么一個(gè)函數(shù)

this.start=function(){
document.onmousemove=function(e){
          var x=e.clientX-self.dX;
          var y=e.clientY-self.dY;
}

好像還差一點(diǎn)我們?cè)僭O(shè)置一個(gè)函數(shù):

this.move=function(x,y){
        self.ele.style.left=x+"px";
        self.ele.style.top=y+"px";
      }

這下就好辦了儡循,我們只要再組織一下

function Fly(imgId){
  this.ele=document.getElementById(imgId);
  var self=this;
  this.ele.onmusedown=function(e){
      e1.preventDefault();                 
      var dX=e1.clientX-oBox.offsetLeft;  
      var dY=e1.clientY-oBox.offsetTop;
  self.start();
  this.ele.onmouseup=function(){              
        window.onmousemove=null;
      }
  }
this.start=function(){
  document.onmousemove=function(e){
    var x=e.clientX-self.detaX;
    var y=e.clientY-self.detaY;
     self.move(x,y)
   }
}
this.move=function(x,y){
  self.ele.style.left=x+"px";
  self.ele.style.top=y+"px";
   }
}

怎么,好像比我之前的代碼少了...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末征冷,一起剝皮案震驚了整個(gè)濱河市择膝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌检激,老刑警劉巖肴捉,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叔收,居然都是意外死亡齿穗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)饺律,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窃页,“玉大人,你說(shuō)我怎么就攤上這事复濒〔甭簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵巧颈,是天一觀的道長(zhǎng)畦木。 經(jīng)常有香客問(wèn)我,道長(zhǎng)砸泛,這世上最難降的妖魔是什么十籍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮唇礁,結(jié)果婚禮上勾栗,老公的妹妹穿的比我還像新娘。我一直安慰自己垒迂,他們只是感情好械姻,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著机断,像睡著了一般楷拳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吏奸,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天欢揖,我揣著相機(jī)與錄音,去河邊找鬼奋蔚。 笑死她混,一個(gè)胖子當(dāng)著我的面吹牛烈钞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坤按,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼毯欣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了臭脓?” 一聲冷哼從身側(cè)響起酗钞,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎来累,沒(méi)想到半個(gè)月后砚作,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘹锁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年葫录,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片领猾。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡米同,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摔竿,到底是詐尸還是另有隱情窍霞,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布拯坟,位于F島的核電站但金,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏郁季。R本人自食惡果不足惜冷溃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梦裂。 院中可真熱鬧似枕,春花似錦、人聲如沸年柠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冗恨。三九已至答憔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掀抹,已是汗流浹背虐拓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傲武,地道東北人蓉驹。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓城榛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親态兴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狠持,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1.JQuery 基礎(chǔ) 改變web開(kāi)發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計(jì)者無(wú)需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性瞻润。 1....
    LaBaby_閱讀 1,350評(píng)論 0 2
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,432評(píng)論 24 450
  • JavaScript的組成 JavaScript 由以下三部分組成:ECMAScript(核心):JavaScri...
    紋小艾閱讀 3,237評(píng)論 0 3
  • 秋天其實(shí)已經(jīng)過(guò)了敢订。今天找了很多的素材,想要心靜下來(lái)罢吃,找到了這幅楚午,不要看我畫(huà)的亂七八糟似乎就一層色,其實(shí)已經(jīng)涂了好幾...
    夏暖心閱讀 159評(píng)論 0 1
  • 這是一年之中最有春天感覺(jué)的那幾天尿招,微風(fēng)和緩舒適矾柜,空氣中都瀰漫著花剛開(kāi)苞的味道,一大早就谜,我很幸運(yùn)地把車停在了最靠近劇...
    南漂作家閱讀 1,172評(píng)論 4 4