整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          html 5教程之默認行為和拖拽思路

          認行為

          什么是默認行為:默認行為就是瀏覽器自己觸發(fā)的事件。比如:a鏈接的跳轉,form提交時的跳轉,鼠標右鍵跳轉;

          oncontexmenu當點擊右鍵菜單的時候;

          return false

          阻止默認行為

          if(e.preventDefault) {

          e.preventDefault();

          }else {

          window.event.returnValue = false;

          }

          事件移除。document.onmouseover=null;

          拖拽

          拖拽事件:

          onmousedown onmousemove onmouseup

          拖拽思路:

          1.給目標元素添加onmousedown事件,拖拽的前提是在目標元素按下鼠標左鍵

          2.當onmousedown發(fā)生以后,此刻給document添加onmousemove事件,意味著此刻鼠標在網頁的移動都將改變目標元素的位置

          3.在onmousemove事件中,設定目標元素的left和top,

          公式

          目標元素的left = 鼠標的clientX – (鼠標和元素的橫坐標差,即offsetX)

          目標元素的top = 鼠標的clientY– (鼠標和元素的縱坐標差,即offsetY)

          4.當onmousedown發(fā)生以后,此刻給document添加onmouseup事件,意味著此刻鼠標在網頁的任意位置松開鼠標,都會放棄拖拽的效果

          在onmouseup事件中,取消document的onmousemove事件即可。

          事件觸發(fā)階段主要由于事件流:DOM0級事件處理階段和DOM2級事件處理;

          DOM0級事件處理,是一種賦值方式,是被所有瀏覽器所支持的,簡單易懂容易操作;

          DOM2級事件處理是所有DOM節(jié)點中的方法,可以重復綁定,但是瀏覽器兼容存在問題;

          非IE下:(這里的事件名不帶on),第三個參數表示是在捕獲階段還是冒泡階段。可以重復綁定事件,執(zhí)行順序按照綁定順序來執(zhí)行。

          oDiv.addEventListener('click',chick,false);

          oDiv.removeEventListener('click',chick ,false);

          IE下:

          只有冒泡階段,所以沒有第三個參數;(這里的事件名需要加on)

          oDiv.attachEvent();

          oDiv.detachEvent() ;

          兼容問題解決:

          var EventUtil={

          addHandler:function(DOM,EventType,fn){

          if(DOM.addEventListener){

          DOM.addEventListener(EventType,fn,false);

          }else if(DOM.attachEvent){

          DOM.attachEvent('on'+EventType,fn)

          }else{

          DOM['on'+EventType]=fn

          }

          },

          removeHandler:function(DOM,EventType,fn){

          if(DOM.removeEventListener){

          DOM.removeEventListener(EventType,fn,false)

          }else if(DOM.detachEvent){

          DOM.detachEvent('on'+EventType,fn)

          }else{

          DOM['on'+EventType]=null;

          }

          }

          }

          寫一個完美拖拽的案例:

          簡介】

          拖放是一種常見的特性, 屬于html5標準的一部分, 即抓取對象以后拖動到另一個位置, 在html5中, 任何元素都可被設置拖放。首先, 我們要給需要拖動的HTML元素啟用拖動功能, 設置屬性draggable="true",

          <div draggable="true"></div>

          提示:a標簽和img標簽默認是啟用該屬性的, 可不需要設置draggable屬性。

          draggable有三個值, 如下所示:

          draggable = true(元素可以被拖動)

          draggable = false(元素不能被拖動)

          draggable = auto(瀏覽器可以自主決定某個元素是否可以被拖動)

          【用法】

          當我們用鼠標拖拽目標元素過程中會觸發(fā)的事件:

          ondragstart:用戶按下鼠標開始拖動時觸發(fā)

          ondrag:用戶正在拖動時反復觸發(fā)

          ondragend:用戶結束拖動后觸發(fā)

          <img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>

          當拖動元素進入目標容器內觸發(fā)的事件:

          ondragenter:鼠標拖動對象進入釋放區(qū)時觸發(fā)

          ondragover:被拖動物體進入目標容器內移動時反復觸發(fā)

          ondragleave:拖動對象在釋放區(qū)沒有釋放就離開容器時觸發(fā)

          ondrop:被拖動物體在目標容器內釋放時觸發(fā)

          <div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>

          ondragenter和ondragover事件的默認行為是拒絕接受任何被拖放的項目, 所以我們必須要做的最重要的事情就是防止這種默認行為的發(fā)生。

          因此, 我們只需要在這兩個事件調用的函數中傳入event對象, 使用event.preventDefault()就可取消這種默認行為;舉個例子, 在drop事件時, Firefox瀏覽器會關閉網頁, 轉而顯示被拖動圖片img元素src所引用的地址。

          取消元素默認行為:

          function ondragenterFun(e){

          e.preventDefault();

          }

          function ondragoverFun(e){

          e.preventDefault();

          }

          在event對象中, 我們會使用dataTransfer屬性來獲取DataTransfer對象, 在DataTransfer對象中有我們操作數據的屬性和方法, 具體如下:

          datatransfer:轉移釋放元素的數據到釋放區(qū), 返回Datatransfer對象

          event.dataTransfer //返回DataTransfer對象

          DataTransfer對象的屬性:

          files:處理從操作系統(tǒng)拖動并釋放到釋放區(qū)的文件;

          types:返回一個字符串數組, 該對象包含了dataTransfer對象中數據的所有類型;

          items:返回DataTransferItems對象, 該對象代表了拖動數據;

          dropEffect:設置拖放目標允許發(fā)生的拖放行為, 如果此處設置的拖放行為不在effectAllowed屬性設置的可拖放行為內, 拖放操作將會失敗。該屬性值只允許為"null"、"copy"、"link"或"move";

          effectAllowed:設置拖動元素允許發(fā)生的拖動行為, 該屬性值可為"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";

          DataTransfer對象的方法:

          setData( format , data ):將指定格式的數據賦值給dataTransfer對象,參數format定義數據的格式也就是數據的類型,data為待賦值的數據。

          getData( format ):從dataTransfer對象中獲取指定格式的數據,format代表數據格式,data為數據。

          clearData( [format] ):從dataTransfer對象中刪除指定格式的數據,參數可選,若不給參數,將刪除對象中所有的數據。

          setDragImage(el, x, y):設置拖放操作的圖標,其中el代表自定義圖標,x代表圖標與鼠標在水平方向上的距離,y代表圖標與鼠標在垂直方向上的距離。

          了解了H5拖動使用的api以后我們接下來看一個綜合的案例, 功能如下:

          1)、實現圖片拖動功能;

          2)、實現圖片復制功能;

          3)、過濾不能拖動的元素;

          4)、實現拖動本地圖片到瀏覽器指定位置;

          公共css部分:

          <style>

          #dropIn{

          border:1px solid #AAAAAA;

          height:100px;

          margin-bottom: 10px;

          padding: 10px;

          }

          #dropIn>img{

          margin-right: 10px;

          border:2px solid deepskyblue;

          }

          img{

          width:100px;

          border-radius: 10px;

          border:2px solid red;

          }

          </style>

          html部分:

          <body>

          <div id="dropIn"></div> <!--釋放區(qū)-->

          <img id="drop1" src="img/a.png" alt="" />

          <!--拖動的圖片元素-->

          </body>

          js部分:

          <script type="text/javascript">
          var darggID;
          function getId(el){
          return document.getElementById(el)
          }
          var dropId1 = getId("drop1");
          var dropInId = getId("dropIn");
          //取消事件默認行為
          dropInId.ondragenter = cancelDefault;
          dropInId.ondragover = cancelDefault; //綁定拖動元素釋放時觸發(fā)的事件
          dropInId.ondrop = drop; //綁定
          dropId1.ondragstart = startFun;
          function cancelDefault(ev){ //取消默認行為
          ev.preventDefault();
          }
          function startFun(ev){
          darggID = ev.target.id;
          //獲取被拖動元素的id
          //從源對象上的事件處理中保存數據,數據類型為"Text"
          ev.dataTransfer.setData("Text",darggID);
          }
          function drop(ev){
          ev.preventDefault();
          // 從目標對象上的事件處理中讀取"Text"類型數據
          var data=ev.dataTransfer.getData("Text");
          // 插入到目標對象中
          ev.target.appendChild(document.getElementById(data));
          }
          </script>

          接下來我們添加兩張圖, "drop2"是實現復制的圖片, "drop3"是既不能復制也不能拖動的圖片;

          <img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

          添加js代碼:

          //獲取頁面元素

          var dropId2 = getId("drop2");

          var dropId3 = getId("drop3");

          //綁定事件

          dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;

          //修改drop函數為

          function drop(ev){

          ev.preventDefault();

          // 從目標對象上的事件處理中讀取"Text"類型數據

          var data=ev.dataTransfer.getData("Text");

          if(data=='drop1'){

          //移動

          ev.target.appendChild(document.getElementById(data));

          }

          if(data=='drop2'){//復制

          var nreEl=document.getElementById(darggID).cloneNode(false);

          getId("dropIn").appendChild(nreEl);

          }

          if(data=='drop3'){//過濾drop3,drop3不做任何操作

          alert('過濾drop3')

          }

          }

          接下來我們實現拖動本地圖片到瀏覽器, 我們就將圖片拖動到id為"dropIn"的這個div中;添加js:

          /*document 監(jiān)聽drop 并阻止瀏覽器打開客戶端的圖片*/

          document.ondragover = function (e) {

          //只有在ondragover中阻止默認行為

          e.preventDefault();

          };

          document.ondrop = function (e) {

          //阻止 document.ondrop的默認行為

          e.preventDefault();

          };

          //dropIn是div的id

          dropIn.ondrop = function (e) {

          var list = e.dataTransfer.files;

          for (var i = 0; i < list.length; i++) {

          var f = list[i];

          reader(f);

          }

          };

          function reader(f) {

          var reader = new FileReader();

          //讀取數據

          reader.readAsDataURL(f);

          reader.onload = function () {

          var img = new Image();

          img.src = reader.result;

          dropIn.appendChild(img);

          }

          }

          【瀏覽器支持】

          目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

          最后再和大家分享一個技巧, 這種拖動行為還能跨瀏覽器工作, 這里說的跨瀏覽器不是瀏覽器之間的跨窗口, 而是可以從Chrome瀏覽器拖動到Firefox瀏覽器, 因為拖放功能的支持是集成在操作系統(tǒng)里面的, 有著相同的特性。

          先,通過視頻了解一下我們要實現的效果,視頻如下:

          <script src="https://lf6-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>

          分析

          1.點擊彈出框,狀態(tài)框和遮擋層(背景變灰)就會顯示出來 display:block;

          2.點擊關閉按鈕,模態(tài)框和遮擋層就會隱藏起來 display:none;

          3.在頁面中拖拽的原理:鼠標按下并且移動,之后松開鼠標

          4.觸發(fā)事件是鼠標按下mousedown,鼠標移動mousemove,鼠標松開mouseup

          5.推拽過程:鼠標移動過程中,獲得最新的值賦給模態(tài)框的left和top值,這樣模態(tài)框就可以跟著鼠標走了

          6.鼠標按下出發(fā)的事件源是最上面一行,就是id為title

          7.鼠標的坐標減去鼠標在盒子內的坐標,才是真正模態(tài)框的位置

          8.鼠標按下,我們要得到鼠標在盒子的坐標

          9.鼠標移動,就讓模態(tài)框的坐標設置為:鼠標坐標減去盒子坐標即可,注意移動事件寫到按下事件里面

          10.鼠標松開,就是停止拖拽,就是可以讓鼠標移動事件解除

          代碼


          主站蜘蛛池模板: 亚洲另类无码一区二区三区| 一区二区三区91| 国产SUV精品一区二区88| 中文字幕一区在线观看视频| 国产在线观看一区二区三区| 中文字幕在线观看一区 | 国产一区二区电影在线观看| 91在线精品亚洲一区二区| 亚洲AV日韩AV一区二区三曲| 国偷自产Av一区二区三区吞精 | 无码毛片一区二区三区中文字幕 | 精品国产一区二区三区香蕉| 无码AV中文一区二区三区| 蜜臀AV在线播放一区二区三区| 在线一区二区观看| 国产午夜一区二区在线观看| 亚洲Av无码一区二区二三区| 丰满岳乱妇一区二区三区| 国产福利一区二区三区视频在线 | 亚洲av乱码一区二区三区| а天堂中文最新一区二区三区| 亚洲AV美女一区二区三区 | 日韩一区二区在线播放| 人妻av无码一区二区三区| 亚洲一区二区三区免费在线观看| 无码国产精品一区二区免费式芒果 | 精品国产一区二区三区AV | 色一情一乱一伦一区二区三区日本| 香蕉久久ac一区二区三区| 日本精品一区二区在线播放| 国产福利在线观看一区二区| 精品女同一区二区| 福利片福利一区二区三区| 国产凸凹视频一区二区| а天堂中文最新一区二区三区| 91麻豆精品国产自产在线观看一区| 精品久久久久一区二区三区 | 美女视频一区二区| 日本一区二区三区在线观看视频 | 国产亚洲日韩一区二区三区| 中文国产成人精品久久一区|