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

談?wù)剬avaScript原生拖放的深入理解

 更新時間:2016年09月20日 08:45:15   作者:小火柴的藍色理想  
拖放(drag-and-drop,DnD)其實是兩個動作——拖和放。所以,它涉及到兩個元素。一個是被拖的元素,稱為拖放源;另一個是要放的目標,稱為拖放目標。本文將通過拆分這兩個概念來詳細介紹原生拖放,感興趣的朋友一起學(xué)習(xí)吧

前面的話

  拖放(drag-and-drop,DnD)其實是兩個動作——拖和放。所以,它涉及到兩個元素。一個是被拖的元素,稱為拖放源;另一個是要放的目標,稱為拖放目標。本文將通過拆分這兩個概念來詳細介紹原生拖放

拖放源

  什么樣的元素才是拖放源呢?

  HTML5為所有HTML元素規(guī)定了一個draggable屬性,表示元素是否可以拖動

  圖像和鏈接的draggable屬性自動被設(shè)置成了true,而其他元素這個屬性的默認值都是false

  [注意]必須設(shè)置draggable='true'才能生效,只設(shè)置draggable不起作用

  默認情況下,文本只有在被選中的情況下才能拖動,而圖像和鏈接在任何時候都可以拖動。而其他元素則無法被拖放

<input value="文字可拖動">
<img alt="圖像可拖動" src="http://files.cnblogs.com/files/xiaohuochai/zan.gif">
<a href="#">鏈接可拖動</a>
<div id="test" style="height:30px;width:300px;background:pink;">元素不可拖動</div>

  當(dāng)為元素設(shè)置draggable屬性后,普通元素也可以拖動

<div draggable="true" style="height:30px;width:100px;background:pink;"></div>

兼容

  IE9-瀏覽器不支持draggable屬性,但可通過mousedown事件處理程序調(diào)用dragDrop()方法來實現(xiàn)拖動效果

<div id="test" style="height:30px;width:300px;background:pink;"></div> 
<script>
test.onmousedown = function(){
this.dragDrop();
}
</script>

  [注意]如果讓firefox支持draggable屬性,必須添加一個ondragstart事件處理程序,并在dataTransfer對象使用setData()方法來啟動效果

拖放事件

  拖放源涉及到3個拖放事件。拖動拖放源時,依次觸發(fā)dragstart、drag和dragend這3個事件

dragstart

  按下鼠標鍵并開始移動鼠標時,會在被拖放的元素上觸發(fā)dragstart事件。此時光標變成“不能放”符號(圓環(huán)中有一條反斜線),表示不能把元素放到自己上面

drag

  觸發(fā)dragstart事件后,隨即會觸發(fā)drag事件,而且在元素被拖動期間會持續(xù)觸發(fā)該事件

dragend

  當(dāng)拖動停止時(無論是把元素放到了有效的放置目標,還是放到了無效的放置目標上),會觸發(fā)dragend事件

<div id="test" draggable="true" style="height:30px;width:100px;background:pink;">0</div> 
<script>
var timer,i=0;
test.ondragstart = function(){
this.style.backgroundColor = 'lightgreen';
}
test.ondrag = function(){
if(timer) return;
timer = setInterval(function(){
test.innerHTML = i++;
},100)
}
test.ondragend = function(){
clearInterval(timer);
timer = 0;
this.style.backgroundColor = 'pink';
}
</script>

拖放目標

  拖放目標是指被拖動的元素松開鼠標時被放置的目標

  拖放源被拖動到拖放目標上時,將依次觸發(fā)dragenter、dragover和dragleave或drop這四個事件

dragenter

  只要有元素被拖動到放置目標上,觸發(fā)dragenter事件

dragover

  被拖動的元素在放置目標的范圍內(nèi)移動時,持續(xù)觸發(fā)dragover事件

dragleave

  如果元素被拖出了放置目標,觸發(fā)dragleave事件

drop

  如果元素被放到了放置目標中,觸發(fā)drop事件

  [注意]firefox瀏覽器的drop事件的默認行為是打開被放到放置目標上的URL。為了讓firefox支持正常的拖放,還要取消drop事件的默認行為

  默認情況下,目標元素是不允許被放置的,所以不會發(fā)生drop事件。只要在dragover和dragenter事件中阻止默認行為,才能成為被允許的放置目標,才能允許發(fā)生drop事件。此時,光標變成了允許放置的符號

<div id="test" draggable="true" style="height:30px;width:130px;background:pink;float:left;">拖放源</div> 
<div id="target" style="float:right;height: 200px;width:200px;background:lightblue;">拖放目標</div>
<script>
var timer,i=0;
var timer1,i1=0;
//兼容IE8-瀏覽器
test.onmousedown = function(){
if(this.dragDrop){
this.dragDrop();
}
}
test.ondragstart = function(){
this.style.backgroundColor = 'lightgreen';
this.innerHTML = '開始拖動';
}
test.ondrag = function(){
if(timer) return;
timer = setInterval(function(){
test.innerHTML = '元素已被拖動' + ++i + '秒';
},1000);
}
test.ondragend = function(){
clearInterval(timer);
timer = 0;i =0;
this.innerHTML = '結(jié)束拖動';
this.style.backgroundColor = 'pink';
}
target.ondragenter = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
this.innerHTML = '有元素進入目標區(qū)域';
this.style.background = 'red';
}
target.ondragover = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
if(timer1) return;
timer1 = setInterval(function(){
target.innerHTML = '元素已進入' + (++i1) + '秒';
},1000);
}
target.ondragleave = function(){
clearInterval(timer1);
timer1 = 0;i1=0;
this.innerHTML = '元素已離開目標區(qū)域';
this.style.backgroundColor = 'lightblue';
}
target.ondrop = function(){
clearInterval(timer1);
timer1 = 0;i1=0;
this.innerHTML = '元素已落在目標區(qū)域';
this.style.backgroundColor = 'orange'; 
}
</script>

dataTransfer對象

  為了在拖放操作時實現(xiàn)數(shù)據(jù)交換,引入了dataTransfer對象,它是事件對象的一個屬性,用于從被拖動元素向放置目標傳遞字符串格式的數(shù)據(jù)

  dataTransfer對象有兩個主要方法:getData()和setData()

  getData()可以取得由setData()保存的值。setData()方法的第一個參數(shù),也是getData()方法唯一的一個參數(shù),是一個字符串,表示保存的數(shù)據(jù)類型,取值為"text"或"URL"

  IE只定義了"text"和"URL"兩種有效的數(shù)據(jù)類型,而HTML5則對此加以擴展,允許指定各種MIME類型。考慮到向后兼容,HTML5也支持"text"和"URL",但這兩種類型會被映射為"text/plain"和"text/uri-list"

  實際上,dataTransfer對象可以為每種MIME類型都保存一個值。換句話說,同時在這個對象中保存一段文本和一個URL不會有任何問題

  [注意]保存在dataTransfer對象中的數(shù)據(jù)只能在drop事件處理程序中讀取

  在拖動文本框中的文本時,瀏覽器會調(diào)用setData()方法,將拖動的文本以"text"格式保存在dataTransfer對象中。類似地,在拖放鏈接或圖像時,會調(diào)用setData()方法并保存URL。然后,在這些元素被拖放到放置目標時,就可以通過getData()讀到這些數(shù)據(jù)

<div>請將從這堆內(nèi)容不同亂七八糟的文字中挑選一些移動到拖放目標中</div> 
<div id="target" style="margin-top:20px;height: 100px;width:200px;background:lightblue;">拖放目標</div>
<div id="result"></div>
<script>
target.ondragenter = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
this.innerHTML = '有元素進入目標區(qū)域';
this.style.background = 'red';
}
target.ondragover = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
}
target.ondragleave = function(e){
e = e || event; 
this.innerHTML = '元素已離開目標區(qū)域';
this.style.backgroundColor = 'lightblue';
}
target.ondrop = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
result.innerHTML = '落入目標區(qū)域的文字為:' + e.dataTransfer.getData('text');
this.innerHTML = '元素已落在目標區(qū)域';
this.style.backgroundColor = 'orange'; 
}
</script>

  當(dāng)然,也可以在dragstart事件處理程序中調(diào)用setData(),手動保存自己要傳輸?shù)臄?shù)據(jù),以便將來使用

<div id="test" draggable="true" data-value="這是一個秘密" style="height:30px;width:100px;background:pink;">拖動源</div> 
<div id="target" style="margin-top:20px;height: 100px;width:200px;background:lightblue;">拖放目標</div>
<div id="result"></div>
<script>
//兼容IE8-瀏覽器
test.onmousedown = function(){
if(this.dragDrop){
this.dragDrop();
}
}
test.ondragstart = function(e){
e = e || event;
e.dataTransfer.setData('text',test.getAttribute('data-value'));
}
target.ondragenter = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
this.innerHTML = '有元素進入目標區(qū)域';
this.style.background = 'red';
}
target.ondragover = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
}
target.ondragleave = function(e){
e = e || event; 
this.innerHTML = '元素已離開目標區(qū)域';
this.style.backgroundColor = 'lightblue';
}
target.ondrop = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
result.innerHTML = '落入目標區(qū)域的文字為:' + e.dataTransfer.getData('text');
this.innerHTML = '元素已落在目標區(qū)域';
this.style.backgroundColor = 'orange'; 
}
</script>

改變光標

  利用dataTransfer對象,不僅可以傳輸數(shù)據(jù),還能通過它來確定被拖動的元素以及作為放罝目標的元素能夠接收什么操作。為此,需要訪問dataTransfer對象的兩個屬性:dropEffect和effectAllowed

  實際上,這兩個屬性并沒有什么用,只是拖動源在拖動目標上移動時,改變不同的光標而已(但是,有一種情況除外)

dropEffect

  dropEffect屬性可以知道被拖動的元素能夠執(zhí)行哪種放置行為。這個屬性有下列4個可能的值

  "none":不能把拖動的元素放在這里。這是除文本框之外所有元素的默認值(此時,將無法觸發(fā)drop事件)

  "move":應(yīng)該把拖動的元素移動到放置目標

  "copy":應(yīng)該把拖動的元素復(fù)制到放置目標

  "link":表示放置目標會打開拖動的元素(但拖動的元素必須是一個鏈接,有URL)

  在把元素拖動到放置目標上時,以上每一個值都會導(dǎo)致光標顯示為不同的符號

  [注意]必須在ondragover事件處理程序中針對放置目標來設(shè)置dropEffect屬性

effectAllowed

  dropEffect屬性只有搭配effectAllowed屬性才有用。effectAllowed屬性表示允許拖動元素的哪種dropEffect

  effectAllowed屬性可能的值如下

  "uninitialized":沒有給被拖動的元素設(shè)置任何放置行為

  "none":被拖動的元素不能有任何行為 

 "copy":只允許值為"copy"的dropEffect

  "link"只允許值為"link"的dropEffect

  "move":只允許值為"move"的dropEffect

  "copyLink":允許值為"copy"和"link"的dropEffect

  "copyMove":允許值為"copy"和"move"的dropEffect

  "linkMove":允許值為"link"和"move"的dropEffect

 "all":允許任意dropEffect

  [注意]必須在ondragstart事件處理程序中設(shè)置effectAllowed屬性

<div id="test" draggable="true" style="height:30px;width:100px;background:pink;display:inline-block;">拖放源</div>
<br>
<div id="target1" style="margin-top:20px;height: 100px;width:150px;background:lightblue;display:inline-block;">(none)拖放目標</div>
<div id="target2" style="margin-top:20px;height: 100px;width:150px;background:lightblue;display:inline-block;">(move)拖放目標</div>
<div id="target3" style="margin-top:20px;height: 100px;width:150px;background:lightblue;display:inline-block;">(copy)拖放目標</div>
<div id="target4" style="margin-top:20px;height: 100px;width:150px;background:lightblue;display:inline-block;">(link)拖放目標</div>
<div id="result"></div>
<script>
//兼容IE8-瀏覽器
test.onmousedown =function(){
if(this.dragDrop){
this.dragDrop();
}
}
test.ondragstart = function(e){
e = e || event;
//兼容firefox瀏覽器
e.dataTransfer.setData('text','');
e.dataTransfer.effectAllowed = 'all';
}
target1.ondragenter = target2.ondragenter =target3.ondragenter =target4.ondragenter =function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}this.style.background = 'red';
}
target1.ondragover = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
e.dataTransfer.dropEffect = 'none';
}
target2.ondragover = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
e.dataTransfer.dropEffect = 'move';
}
target3.ondragover = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
e.dataTransfer.dropEffect = 'copy';
}
target4.ondragover = function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
e.dataTransfer.dropEffect = 'link';
}
target1.ondragleave = target2.ondragleave =target3.ondragleave =target4.ondragleave =function(e){
e = e || event; this.style.backgroundColor = 'lightblue';
}
target1.ondrop = target2.ondrop =target3.ondrop =target4.ondrop =function(e){
e = e || event;
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
this.style.backgroundColor = 'orange'; 
}
</script>

以上所述是小編給大家介紹的JavaScript原生拖放,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 兼容FF/IE跟隨鼠標的層的效果

    兼容FF/IE跟隨鼠標的層的效果

    兼容FF/IE跟隨鼠標的層的效果...
    2007-08-08
  • JS小游戲之宇宙戰(zhàn)機源碼詳解

    JS小游戲之宇宙戰(zhàn)機源碼詳解

    這篇文章主要介紹了JS小游戲之宇宙戰(zhàn)機源碼,是一款非常經(jīng)典的游戲源碼,包含了游戲設(shè)計中比較常見的邏輯處理,本文附帶了該游戲的完整源碼,需要的朋友可以參考下
    2014-09-09
  • 在 JavaScript 中如何更改字符串字符

    在 JavaScript 中如何更改字符串字符

    在本文中,我們將創(chuàng)建自定義函數(shù),借助不同示例的默認字符串方法,在我們想要的任何位置替換或更改字符串中的字符,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-07-07
  • js圖片下載方式集合(附詳細代碼)

    js圖片下載方式集合(附詳細代碼)

    關(guān)于圖片下載問題,不同的瀏覽器,需要兼容的下載方式,這篇文章主要給大家介紹了關(guān)于js圖片下載方式的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • js實現(xiàn)獲取兩個日期之間所有日期的方法

    js實現(xiàn)獲取兩個日期之間所有日期的方法

    這篇文章主要介紹了js實現(xiàn)獲取兩個日期之間所有日期的方法,涉及javascript針對日期與時間的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 微信小程序 導(dǎo)入圖標實現(xiàn)過程詳解

    微信小程序 導(dǎo)入圖標實現(xiàn)過程詳解

    這篇文章主要介紹了微信小程序 導(dǎo)入圖標實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • uni-app入門頁面布局之window和tabbar詳解

    uni-app入門頁面布局之window和tabbar詳解

    每個頁面按照結(jié)構(gòu)可以分成三部分:window?page?tabbar.其中window和tabbar一般比較固定,page是平常業(yè)務(wù)開展的主要載體,根據(jù)業(yè)務(wù)需求進行頁面配置。下面主要講一下window和tabbar,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • 關(guān)于加快微信小程序開發(fā)的一些小建議

    關(guān)于加快微信小程序開發(fā)的一些小建議

    微信小程序是一種全新的連接用戶與服務(wù)的方式,下面這篇文章主要給大家介紹了關(guān)于加快微信小程序開發(fā)的一些小建議,需要的朋友可以參考下
    2021-05-05
  • javascript eval(func())使用示例

    javascript eval(func())使用示例

    eval的作用其實很簡單,就是把一段字符串傳遞給JS解釋器,由Javascript解釋器將這段字符串解釋成Javascript代碼,下面有個不錯的示例,感興趣的朋友可以參考下
    2013-12-12
  • TS如何從目錄中提取所有指定擴展名的文件

    TS如何從目錄中提取所有指定擴展名的文件

    .ts是一種高清視頻封裝格式文件,全稱為MPEG2-TS,TS表示TransportStream,這篇文章主要介紹了TS如何從目錄中提取所有指定擴展名的文件,需要的朋友可以參考下
    2023-05-05

最新評論

永仁县| 金塔县| 泾阳县| 庆安县| 东乡县| 安顺市| 大关县| 山西省| 柞水县| 且末县| 岳阳县| 昆明市| 余干县| 来宾市| 公安县| 依安县| 庆阳市| 盘锦市| 麻阳| 项城市| 普陀区| 云龙县| 无锡市| 巴中市| 晋中市| 曲阜市| 霍林郭勒市| 平江县| 遵义县| 团风县| 简阳市| 浦北县| 吉木乃县| 江永县| 天门市| 柞水县| 彭州市| 达州市| 大田县| 莒南县| 台安县|