此博客是本人从学生时代开始做笔记所用, 部分是工作所遇问题,做填坑笔记,部分闲来查阅资料,加上自己的理解所总结的学习笔记, 常忙得不可开交,若漏了资料来源,望通知~ 前路漫漫,写点东西告诉自己正在一点点进步,而不要迷失于繁忙。

拖动事件小解

首先,要想拖动元素,首先得设置draggable= "true"

适用范围:默认图片和链接是可拖动的,无需添加

兼容性: Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari

eg: <img id= "aa" src="img/aHead.png" draggable="true" ondragstart="drag(event)" alt=""/>

 

相关方法:

在拖动目标上触发的方法:

ondragstart:开始拖动对象

ondrag:拖动过程中(每隔350ms触发一次)

ondragend:拖动结束(未释放成功就不会触发!)

 

在释放目标上触发的方法:

ondragenter:对象进入释放目标(超过一半进入触发)

ondraghover:对象在释放目标内移动(每隔350ms触发一次)

ondragleave:对离开释放目标(超过一半离开触发)

ondrop:释放对象(ondrop在线,ondragend在后)

 

实例:

源代码:

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

<style>

.droptarget {

    float: left; 

    width: 100px; 

    height: 35px;

    margin: 15px;

    padding: 10px;

    border: 1px solid #aaaaaa;

}

</style>

</head>

<body><p>在两个矩形框中来回拖动 p 元素:</p>

<div class="droptarget">

    <p draggable="true" id="dragtarget">拖动我!</p>

</div>

<div class="droptarget"></div>

<p style="clear:both;"><strong>注意:</strong>Internet Explorer 8 及更早 IE 版本或 Safari 5.1 及更早版本的浏览器不支持 drag 事件。</p>

<p id="demo"></p>

<script>

/* 拖动时触发*/

document.addEventListener("dragstart", function(event) {

    //dataTransfer.setData()方法设置数据类型和拖动的数据

    event.dataTransfer.setData("Text", event.target.id);

    // 拖动 p 元素时输出一些文本

    document.getElementById("demo").innerHTML = "开始拖动 p 元素.";    

    //修改拖动元素的透明度

    event.target.style.opacity = "0.4";

});

//在拖动p元素的同时,改变输出文本的颜色

document.addEventListener("drag", function(event) {

    document.getElementById("demo").style.color = "red";

});

// 当拖完p元素输出一些文本元素和重置透明度

document.addEventListener("dragend", function(event) {

    document.getElementById("demo").innerHTML = "完成 p 元素的拖动";

    event.target.style.opacity = "1";

});

/* 拖动完成后触发 */

// 当p元素完成拖动进入droptarget,改变div的边框样式

document.addEventListener("dragenter", function(event) {

    if ( event.target.className == "droptarget" ) {

        event.target.style.border = "3px dotted red";

    }

});

拖动事件MouseEvent()内有dataTransfer属性

属性如下:

  1. dropEffect: "none"
  2. effectAllowed: "none"
  3. files: FileList
  4. items: DataTransferItemList
  5. types: Array[0]
  6. __proto__: DataTransfer

 解析如下:

属性:

effectAllowed: 规定元素被拖动时允许的效果,在ondragstart中设置

  1.copy 复制

  2.move 移动

  3.link 建立一个源位置到新位置的链接

  4.copyLink:复制或链接

  5.copyMove

  6.linkMove

  7.all: 所有操作

  8.none: 禁止所有

  9.uninitialized:缺省值(默认值)相当于all

----------------------------------------------------------------------------------------------------------------

dropEffect:规定元素被拖进当前放入元素时的效果,可在ondragenter或ondraghover中设置

  1.copy 2.move 3.link 4.none(禁止放置)

----------------------------------------------------------------------------------------------------------------

items:该属性返回DataTransferItems对象,该对象代表了拖动数据。

---------------------------------------------------------------------------------------------------------------

types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。

 

主要方法:

setData(format,data):

功能:将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据

说明:format: IE只允许"text"或"URL"两种类型,html5允许所有MIME类型,也支持"text"和"URL",考虑到ff的兼容性,设置时"text"写做"Text","URL"大写,读取文本时用"Text",读取url时检测"url"和"URL"

  在拖动文本或链接时,浏览器会调用此方法,将文本以"text"形式存储于dataTransfer对象,将链接以"url"形式存储于dataTransfer对象

  只能在ondrop中读取

  若没有放置成功,DataTransfer会自行销毁!

getData(format):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据

clearData([format]):从dataTransfer对象中删除指定格式的数据,参数可选,若不给出,则为删除对象中所有的数据。

addElement(element):添加自定义图标

setDragImage(element,x,y):设置拖放操作的自定义图标。其中element设置自定义图标,x设置图标与鼠标在水平方向上的距离,y设置图标与鼠标在垂直方向上的距离。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

相关问题:

ondragend坐标:

最初以为在此事件中,光标位置与ondrop一致,后来在实践中发现其位置的x,y轴坐标远大于ondrop事件的光标坐标!

ondrop兼容性:

兼容chrome,firefox,不兼容Safari5.1.2以下!(本人一直使用5.1.7,发现除了ondrop以外其他事件在低版本中均支持,当我用window下载5.3时发现下下来的依旧是5.1.7!,这是匪夷所思之处,而且根据这点可确定ondrop在5.1.7中依旧不支持)

拖动失效:

一般情况下是因为 ondragenter与ondragover事件没有加上preventDefault(),因为拖拽的默认行为时打开新链接,加上后还能让chrome浏览器拖拽光标不再是禁止符号,

当拖动对象非图片,链接时,Safari,firefox上均有可能失效,

解决方法: safari: 给当前拖动对象 加上-webkit-user-drag: element;

    firefox: 在ondragstart事件中,调用setData方法给dataTransfer加入数据 eg: event.dataTransfer.setData('Text', 1);

拖拽对象为图片,拖拽时图片变小:

当拖拽对象为图片,拖动它时,随着光标的虚影会变小,这时建议不要将拖动对象设为图片,而将图片作为一个div的背景,将此div设为拖拽对象,并将其draggable属性设为true

 

posted @ 2016-10-25 15:32  炎泽  阅读(879)  评论(0编辑  收藏  举报