最早引入JS拖放功能的是IE4,当时,网页中只有两种对象可以拖放:图像和某些文本。拖动图像时,把鼠标放在图像上,按住鼠标不放就可以拖动它。拖动文本时,需要选中文本,然后可以像拖动图像一样拖动被选中的文本。在IE4中,唯一有效的放置目标是文本框,到了IE5拖放功能得到扩展,添加了新的事件,而且网页中任何元素都可以作为放置目标,IE5.5更进一步,让网页中的任何元素都可以拖放,IE,Firfox3.5,Safari3+,Chrome都实现了原生拖放功能。

一、可拖放属性draggable

  默认情况下,图像、链接、文本是可以拖动的,文本只有在被选中的情况下才能拖动,而图像和链接在任何时候都可以拖动,这是因为图像和链接 的draggable属性自动被设置成true,而其他元素这个属性的默认值都是false,所以要想让其他元素可拖动,或者让图像或链接不能拖动,都可以设置draggable这个属性来改变他们的可拖动状态。

  例如: <!--让这个图像不可以拖动-->

      <img src="test.jpg" draggable="false" >

     <!--让这个元素可以拖动-->

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

支持draggable属性的浏览器有IE10+,Firfox4+,Safari5+,Chrome,另外为了让Firfox支持可拖放属性,还必须添加一个ondragstart事件处理程序,并在dataTransfer对象中保存一些信息。

二、事件对象dataTransfer

  dataTransfer是事件对象的一个属性,用于从被拖动元素向放置目标传递字符串格式的数据,因为它是事件对象的属性,所以只能在拖放事件的事件处理程序中访问dataTransfer对象。在事件处理程序中,可以使用这个对象的属性和方法,来完善拖放功能,

  dataTransfer对象主要有两个方法:setData() 和 getData(),getData()可以取得由setData()保存的值,setData()方法的第一个参数,也是getData()方法的唯一一个参数,是一个字符串,表示保存的数据类型,取值为"text"或"URL"。

  例如:

      //设置和接收文本数据

        event.dataTransfer.setData("text","some text");

        var text=event.dataTransfer.getData("text");

      //设置和接收URL

        event.dataTransfer.setData("URL","http://www.blog.com/");

        event.dataTransfer.getData("URL");

  IE只定义了"text"和"URL"两种有效的数据类型,而HTML5则对此加以扩展,允许指定各种MIME类型,考虑到向后兼容,H5也支持"text"和"URL",但这两种类型会被映射为"text/plain"和"text/uri-list"。实际上,dataTransfer对象可以为每种MIME类型都保存一个值,保存在dataTransfer对象中的数据只能在drop事件处理程序中读取,如果没有在onDrop处理程序中读到数据,那就是dataTransfer对象已被销毁,数据也丢失了。

  将数据保存为文本和保存为URL是有区别的,如果将数据保存为文本格式,那么数据不会得到任何特殊处理,而如果将数据保存为URL,浏览器会将其当成网页中的链接,,也就是如果你把它放置到另一个浏览器窗口中,浏览器就会打开该URL。

  由于Firfox在其第5个版本之前不能正确的将"url"和"text"映射为"text/uri-list"和"text/plain",但是却能把"Text"(T大写)映射为"text/plain",为了更好的在跨浏览器的情况下从dataTransfer对象取得数据,最好在取得URL数据是检测两个值,而在取得文本数据时使用"Text"。

//读取URL

  var url=event.dataTransfer.getData("url")||event.dataTransfer.getData("text/uri-list");

//读取文本

  vat text=dataTransfer.getData("Text");

   注意。一定要把端数据类型放在前面,因为IE10及之前的版本仍然不支持扩展的MIME类型名。在遇到无法识别的数据类型时,会报错。

三、dropEffect 和 effectAllowed属性 

  dataTranfer 对象的两个属性:dropEffect 和 effectAllowed,这两个属性用来确定被拖动元素以及作为放置目标的元素能够接收什么操作。

  通过dropEffect属性可以知道被拖动元素能够执行哪种放置行为,这个属性有4个可能的值:

    (1)"none":不能把拖动的元素放在这里,这是除文本框之外所有元素的默认值

    (2)"move":应该把拖动的元素移动到放置目标

    (3)"copy":应该把拖动的元素复制到放置目标

    (4)"link":表示放置目标会打开拖动的元素(但拖动的元素必须是一个链接,有URL)

把元素拖动到放置目标上时,以上每一个值都会导致光标显示为不同的符号。要使用dropEffect属性,必须在ondragenter事件处理程序中针对放置目标来设置它。

  dropEffect属性只有搭配effectAllowed属性才有用。effectAllowed属性表示允许拖动的元素的哪种dropEffect,effectAllowed属性可能的值有:

    (1)"uninitialized":没有给被拖动元素设置任何放置行为

    (2)"none":被拖动的元素不能有任何行为

    (3)"copy":只允许值为"copy"的dropEffect

    (4)"link":只允许值为"link"的dropEffect

    (5)"move":只允许值为"move"的dropEffect

    (6)"copyLink":只允许值为"copy"和"link"的dropEffect

    (7)"copyMove":只允许值为"copy"和"move"的dropEffect

    (8)"linkMove":只允许值为"link"和"move"的dropEffect

    (9)"all":允许任意dropEffect

  注意,必须在ondragstart事件处理程序中设置effectAllowed属性。

四、拖放事件

1.拖动某元素时,将依次触发下列事件:

  (1)dragstart:按下鼠标并开始移动时,会在被拖放的元素上触发dragstart事件

  (2)drag:触发dragstart事件后,随即就会触发drag事件,而且爱元素被拖动期间会持续触发该事件

  (3)dragend:当拖动停止时(无论是把该元素放到了有效的放置目标上还是放到了无效的放置目标上),会触发dragend事件

  上面这三个事件的目标都是被拖动元素,大多数浏览器会为正在被拖动的元素创建一个半透明的副本,这个副本始终跟随着光标移动。

2.当某个元素被拖动到一个有效的放置目标上时,下列事件会依次触发:

  (1)dragenter:只要有拖动元素被拖动到放置目标上,就会触发dragenter事件

 (2)dragover:在被拖动元素爱放置目标的范围内移动时,就会持续触发改事件

  (3)dragleave 或drop:当被拖动元素拖出了放置目标,将触发dragleave事件,如果元素被放到了放置目标中,则会触发drop,而不会触发dragleave事件。

  什么是有效的的放置目标呢?在拖动元素经过某些无效放置目标时,可以看到一种特殊的光标(圆环中有一条反斜杠),表示不能放置。虽然所有元素都支持放置目标事件,但这些元素默认是不允许放置的,所有要想把任何元素变成有效的放置目标,方法是重写dragenter 和dragover事件的默认行为,也就是event.preventDefault()。这样,当被拖动元素移动到放置目标上时,光标变成了允许放置的符号,释放鼠标时,也会触发drop事件。但是drop事件的默认行为是打开被放盗放置目标上的URL,当吧文本拖放到放置目标上,则会导致无效的URL错误,因此为了让Firfox致辞正常的拖放,还要取消drop事件的默认行为。

HTML5新属性-----拖放的更多相关文章

  1. HTML5新属性在Google浏览器中不能显示的问题

    这两天在学习HTML5新属性时遇到了如下问题,很是不解: 例如在学习使用canvas时,需要绘制一个红色的原点,代码如下: <!DOCTYPE HTML> <html> < ...

  2. (二)给IE6-IE9中的input添加HTML5新属性-placeholder

    同样是最近遇到的一个小问题.因为IE9以下input是不支持placeholder属性的.在网上找到了解决方案,果断带走.正如鲁迅先生所说的‘拿来主义’:运用脑髓,放出眼光,自己来拿!感谢.借花献佛在 ...

  3. 【HTML】html5新属性-datalist

    摘要: 为实现输入域自动填充的效果 方法一: jquery-ui的autocomplete方法, 不是jquery 自带的方法. 方法二: 采用html5新特性,datalist,例子如下:坏处很明显 ...

  4. HTML5新属性

    1.contenteditable 属性指定元素内容是否可编辑. 注意: 当元素中没有设置 contenteditable 属性时,元素将从父元素继承. 所有主流浏览器都支持 contentedita ...

  5. HTML5 新属性的讲解

    1.选择器: 标签选择器: class选择器: id选择器: 后代选择器:div li div下所有li 子代选择器:div>li div的所有子一代 li 元素 交集选择器:div.class ...

  6. html5 新属性

    <p contenteditable="true">这是一段可编辑的段落.请试着编辑该文本.</p> <input id="email&qu ...

  7. html5新属性contenteditable 对于那些不可编辑的标签,现在都可以编辑了

    contenteditable = true 表示该html标签的内容可以编辑,对于那些不可编辑的标签,现在都可以编辑了.

  8. sad 关于一些html5新属性还需要用https才能支持

    像我昨天在搞一个录音的小东西 在本地正常录音正常播放 但是放到线上环境http环境上就出现了如上的错误 功能都不能正常使用 然后就改成https线上环境  然后就正常了 如上 大家有什么赐教的欢迎留言 ...

  9. HTML5新特性--svg-echarts(重点)-拖动API-WebWorker

    一.html5新特性--svg--(折线/渐变特效对象/滤镜) #折线:多个坐标点组件一条折线 <polyline points="50,50 70,55 60,66 " s ...

随机推荐

  1. 使用mysqlbinlog工具进行基于位置或时间点的数据恢复

    使用mysqlbinlog工具进行基于位置或时间点的恢复 MySQL备份一般采取全备份加日志备份的方式,比如每天执行一次全备份,每小时执行一次二进制日志备份.这样在MySQL Server故障后可以使 ...

  2. http://www.cnblogs.com/stephen-liu74/archive/2012/08/01/2561557.html

    http://www.cnblogs.com/stephen-liu74/archive/2012/08/01/2561557.html

  3. Android TextView 字符串展示不同大小文字

    用Spannable字符串实现: String s= "Hello Everyone"; SpannableString ss1= new SpannableString(s); ...

  4. centos出现磁盘坏掉,怎么修复和检测。

    当dmesg的时候,出现下面的信息说明磁盘有问题 Info fld=0x139066d0 end_request: I/O error, dev sda, sector 328230608 Buffe ...

  5. Linux中的读函数与块高速缓存

    为了提高Linux块设备读写的效率,Unix会在内存中建立块高速缓存,块高速缓存存储了系统最近读的数据块和刚刚写入的数据块,也就是说IO访问其实是和块高速缓存打交道的(直接IO除外),块高速缓存会适时 ...

  6. Square Coins(母函数)

    Square Coins 点我 Problem Description People in Silverland use square coins. Not only they have square ...

  7. quoit design(hdoj p1007)

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  8. XML的DTD约束

    DTD约束:DTD的声明和引用 1.内部DTD文档 <!DOCTYPE 根元素 [定义内容]> 2.外部DTD文档 <!DOCTYPE 根元素 SYSTEM "DTD文件路 ...

  9. Firebug Command Line

    http://michaelsync.net/2007/09/15/firebug-tutorial-commandline-api

  10. 【写一个自己的js库】 5.添加修改样式的方法

    1.根据id或class或tag修改样式,样式名是-连接格式的. function setStyleById(elem, styles){ if(!(elem = $(elem)) return fa ...