Html5 拖拽行为和AngularJs的结合

一. Html5的拖拽行为

  1.设置元素为可拖放:把draggable属性设置为true.

  example: <div id="drag1" draggable="true"></div>

(注:img和带href的a默认是auto,表示可拖拽,其他的元素都是不可拖拽。为安全起见,建议对可拖拽元素都添加draggable=‘true‘设置)

2.拖拽元素事件:

  1). dragstart:拖拽前触发,即鼠标按下,被拖拽元素被拖拽的瞬间触发。

event.dataTransfer:传递数据,数据类型为字符串和文件类型。

event.dataTransfer的大部分设置均在这里配置,即通过event.dataTransfer来保存拖拽的数据,例如:e.dataTransfer.setData("Text", e.target.id);

event.dataTransfer.effectAllowed:用于设置被拖拽元素可执行的操作

example:event.dataTransfer.effectAllowed = "link";  限定dropEffect的属性值为link,否则会鼠标指针为禁止样式

触发dragstart事件后,其他元素的mousemove,mouseover,mouseenter,mouseleave,mouseout事件均不会被触发了

2). drag:拖拽前、拖拽结束之间连续触发,即使鼠标没有移动,只要未释放,都会触发。

3). dragend:拖拽结束触发,即释放鼠标触发。

3.目标元素事件:

1). dragenter:进入目标元素触发,相当于mouseover

2). dragover:被拖拽元素在目标元素上移动时触发,相当于mousemove

在该事件里填写: event.preventDefault() 。

   (注:事件的默认行为是不允许被拖拽元素在其他元素上释放或放置(即无法触发 drop 事件),需要通过 event.preventDefault() 来阻止默认行为才能触发后续的 drop 事件)

    dropEffect:拖放的操作类型,决定了浏览器如何显示鼠标形状,可能的值为copy、move、link和none。

可以在这里设置dropEffect的值,事件的默认行为是将dropEffect设置为none。

例如:e.dataTransfer.dropEffect = "link"

3). dragleave:被拖拽元素离开目标元素时触发

4). drop:被拖拽元素放置在目标元素上时触发(释放鼠标)

(注:对于外来的被拖拽元素(超链接、文件、图片源), drop 事件的默认行为是浏览器将当前页面重定向到被拖拽元素所指向的资源上

       对文档内部的被拖拽元素,IE10+和Chrome下的默认行为是不作为,而FF得默认行为是新打开一个文档用于访问被拖拽元素所指向的资源)

4.事件执行顺序

   1) drop不触发的时候:dragstart  >  drag >  dragenter >  dragover >  dragleave > dragend

2) drop触发的时候(dragover阻止了默认事件):dragstart  >  drag >  dragenter >  dragover >  drop > dragend

二:拖拽事件和Angular JS的结合

html

<!DocType html>
<html data-ng-app="myApp">
<head>
    <title>angularjs 和拖拽事件的结合</title>
    <meta charset="utf-8" />
    <script type="text/javascript" src="angular.js"></script>
    <script type="text/javascript" src="dragdirective.js"></script>
    <script type="text/javascript" src="mydrag.js"></script>
    <style type="text/css">
        .mydemo > div {
            display: inline-block;
        }

            .mydemo > div > div {
                width: 150px;
                height: 100px;
                border: 1px dotted grey;
                display: inline-block;
                float: left;
                margin-right: 20px;
            }
    </style>
</head>
<body data-ng-controller="myDragController as vm" class="mydemo">
    <div>
        <div ruby-drop="vm.drop(event)" ruby-dragover="vm.dragover(event)">
            <img src="ruby.png" draggable="true" ruby-dragstart="vm.dragstart(event)" id="imgId" />
        </div>
        <div ruby-drop="vm.drop(event)" ruby-dragover="vm.dragover(event)"></div>
    </div>
</body>
</html>

js->dragdirective.js

(function () {
    "use strict"
    var convertFirstUpperCase = function (str) {
        return str.replace(/(\w)/, function (s) {
            return s.toUpperCase();
        });
    }
    angular.module("myApp", []);
    var myApp = angular.module("myApp"),
        rubyDragEventDirectives = {};
    angular.forEach("dragstart drag dragenter dragover drop dragleave dragend".split(‘ ‘), function (eventName) {
        var rubyEventName = ‘ruby‘ + convertFirstUpperCase(eventName);
        rubyDragEventDirectives[rubyEventName] = [‘$parse‘, function ($parse) {
            //$parse 语句解析器
            return {
                restric: ‘A‘,
                compile: function (ele, attr) {
                    var fn = $parse(attr[rubyEventName]);
                    return function rubyEventHandler(scope, ele) {
                        ele[0].addEventListener(eventName, function (event) {
                            if (eventName == ‘dragover‘ || eventName == ‘drop‘) {
                                event.preventDefault();
                            }
                            var callback = function () {
                                fn(scope, { event: event });
                            };
                            callback();
                        });
                    }
                }
            }
        }]
    });
    myApp.directive(rubyDragEventDirectives);
})();

  js->mydrag.js

(function () {
    "use strict"
    if (window.angular) {
        angular.module("myApp").controller("myDragController", myDragController);
        myDragController.$inject = [‘$scope‘];
        function myDragController($scope) {
            $scope.vm.dragstart = function (e) {
                e.dataTransfer.setData("Text", e.target.id);
            };
            $scope.vm.dragover = function (e) {
                e.preventDefault();
            };
            $scope.vm.drop = function (e) {
                e.preventDefault();
                var data = e.dataTransfer.getData("Text");
                e.target.appendChild(document.getElementById(data));
            };
        }
    }
})();

(注:Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。)

时间: 2025-01-23 07:05:24

Html5 拖拽行为和AngularJs的结合的相关文章

每天一个JavaScript实例-html5拖拽

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-html5拖拽</title> <style> #drop{ width:300px; height:200px; background-

Java实现HTML5拖拽文件上传

这是主页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+reques

html5 拖拽的简要介绍

1,首先,你要告诉计算机那个元素可以拖动,或者是一张图,或者是一个盒子,在标签里面加上 draggable="true"  2,然后,监听该元素被拖动的函数 ondragstart="drag(event)" 3,drag 里面告诉计算机是那个元素被拖动的 ev.dataTransfer.setData("Text",ev.target.id); 4,接下来将拖动的元素放到哪个盒子,(或者是经过那个盒子,经过某个盒子的时候触法 ondragove

html5拖拽-初探

先看看效果 完整测试代码: <p>Html5 拖拽</p> <div id="box" ondrop="handleDrop(event)" ondragover="allowDrop(event)"></div> <br> <img id="img1" src="images/screen1.jpg" draggable="tru

Html5拖拽复制

拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需要实现Html5拖拽复制的功能,Html5拖拽复制很简单,只需要在普通Html5拖拽的过程中做一点小小的改动即可. ps: 本篇博文为非首页文章,只是简单的笔记. 浏览器支持 Internet Explorer 9 Firefox Opera 12 Chrome Safari 5 v1.0代码部分

html5 拖拽练习题

html5新的拖拽 只支持Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 来一个实例: <!DOCTYPE html> <html> <head> <style type="text/css"> table td{ width:120px; height:50px; border:1px solid #000; } table td div.dragDiv{ ma

HTML5 拖拽实现

简介: 最早在网页中引入JavaScript拖放功能是IE4.当时,网页中只有两种对象可以拖放:图像和某些文本.拖放图像时,把鼠标放到图像上,按住鼠标不放就可以拖放它.拖放文本时,要先选中文本,然后可以像拖放图像一样拖放被选中的文本.在IE4中,唯一有效的放置目标是文本框.到了IE5,拖放功能得到拓展,添加了新的事件,而且几乎网页中的任何元素都可以作为放置目标.IE5.5更进一步让网页中的任何元素都可以拖放.HTML5以IE的实例为基础指定了拖放规范.  一.基本释义  1 实现拖拽效果   *

HTML5拖拽——将本地文件拖拽到网页中显示

HTML5标准中的提供的用于文件输入输出(I/O)的对象 File: 代表一个文件对象 FileList: 代表一个文件列表,类数组对象 FileReader 用于从文件中提取内容 FileWrite 用于向文件中写入类容 这些对象需要在 H5的拖拽事件中通过 e.dataTransfer 来访问和获取 完成效果如下: Data URL给了我们一种很巧妙的将图片"嵌入"到HTML中的方法.跟传统的用img标记将服务器上的图片引用到页面中的方式不一样,在Data URL协议中,图片被转换

HTML5拖拽上传图片预览

参考博文1:http://blog.csdn.net/testcs_dn/article/details/8695532 参考博文2:http://justcoding.iteye.com/blog/2105760 1.文件API:(File API) file类型的的表单控件选择的每一个文件都是一个file对象,而FileList对象则是这些file对象的集合列表,代表所选择的所有文件.file对象继承于Blob对象,该对象表示二进制原始数据,提供slice方法,可以访问到字节内部的原始数据块