HTML5新增了关于拖放的API,通过API可以让HTML页面的任意元素都变成可拖动的,通过使用拖放机制可以开发出更友好的人机交互的界面。

 拖放操作可以分为两个动作:在某个元素上按下鼠标移动鼠标(没有松开鼠标),此时开始拖动;在拖动的过程中,只要没有松开鼠标,将会不断产生事件-----这个过程称为“拖”。把被拖动的元素拖动到另外一个元素上并松开鼠标-----这个过程被称为“放”。

一、启动拖放

在HTML5中,<img .../>元素默认就是可拖动的;而<a .../>元素只要设置了href属性,它默认也是 可拖动的。

对于普通的元素,如果想要让它变成可拖动的只要将该元素的draggable属性设置为true即可。但仅仅设置该元素的draggable属性还不够,因为仅仅设置了draggable='true'只是表示该元素可拖动,但拖动时并未携带数据,因此用户看不到拖动的效果。

 为了 让拖动操作能携带数据,应该为被拖动的元素指定ondragstart事件指定监听器,在该监听器中让拖动操作可以携带数据。

    <div style="width:150px;height:150px;background:rgba(195, 86, 246, 0.31);border:1px solid gray;"
         id="div1"
         draggable="true">
        可拖动div
    </div>
    <script type="text/javascript">
        //绑定拖动事件
        var div1 = document.getElementById('div1');
        div1.ondragstart = function (e) {
            //让拖动操作携带数据
            e.dataTransfer.setData('text/plain','www.baidu.com');
        }
    </script>

二、接受“放”

拖动时显示禁止图标,这表拖动到的“目的地”并不接受拖动的元素-----这是因为当拖动元素经过document时,document对象默认阻止了拖动事件,而其他HTML组件也位于document对象内,因此它们也不能接受“放”。

为了让document可以接受“放”,应该为documen的ondragover事件指定监听器,在监听器中取消document对拖动事件的默认行为。

document.ondragover=function(){

  //取消事件的默认行为

   return false;

}

当用户把div元素拖到指定位置释放后,Firefox浏览器默认会打开一个新页面,页面的URL正是拖放操作携带的数据。如果使用Chrome浏览器来浏览该页面,当用户把div元素拖放到指定位置释放后,Chrome浏览器并没有执行任何默认动作。

 由此可见,不同浏览器对于拖放操作的默认动作并不相同,如果开发者取消拖放操作的默认动作,则可以为document的ondrop事件绑定监听器。

document.ondrop=function(e){

e.stopPropagation();
e.preventDefault();

  //取消默认行为

  return false;

}

实例:

    <a href="http://www.baidu.com" id="link1">百度首页</a>
    <script type="text/javascript">
        var link1 = document.getElementById('link1');
        //链接事件
        link1.onclick = function () {

            //实验证明,超练级的取消浏览器默认动作 return false;可行
            //取消默认操作
            return false;
        }
        //拖拽处理
        document.ondragover = function (e) {
            e.stopPropagation();
            e.preventDefault();
        }
        document.ondrop = function (e) {
            e.stopPropagation();
            e.preventDefault();

            //实验证明,在拖拽API中,火狐浏览器的取消默认操作 return false;没有起作用
            //return false;
        }
    </script>
View Code

相关文章: