• H5 的 Draggable 属性


    HTML5提供专门的拖拽与拖放的API,

    设置元素为可拖放

    首先,为了使元素可拖动,把 draggable 属性设置为 true :< li draggable="true"> aaaa</li>  否则不会有效果

    二、相关重点

    1. dataTransfer 对象:拖拽对象用来传递的媒介,使用一般为Event.dataTransfer。 在 event对象下
    2. draggable 属性:就是标签元素要设置draggable=true,否则不会有效果,
    3. //drag的顺序:
      1. ondragstart    事件:  当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖曳元素
      2. ondrag           事件: 在dangstart 和 dargend 之间发生的, 此事件作用在被拖曳元素
      3. ondragenter    事件: 拖曳元素进入目标元素的时候触发的事件,此事件作用在目标元素上
      4. ondragover     事件:拖拽元素在目标元素上移动的时候触发的事件,此事件作用在目标元素上
      5. ondrop          事件:被拖拽的元素在目标元素上同时鼠标放开触发的事件,此事件作用在目标元素上
      6. ondragleave     事件:被拖拽的元素在目标元素上同时鼠标放开触发的事件,此事件作用在目标元素上 (一般 有了 drop就没有dragleave 事件 )
      7. ondragend   事件:当拖拽完成后触发的事件,此事件作用在被拖曳元素上
    4. Event.preventDefault() 方法:阻止默认的些事件方法等执行。在ondragover中一定要执行preventDefault(),否则ondrop事件不会被触发。另外,如果是从其他应用软件或是文件中拖东西进来,尤其是图片的时候,默认的动作是显示这个图片或是相关信息,并不是真的执行drop。此时需要用用document的ondragover事件把它直接干掉。
    5. event.dataTransfer.effectAllowed 属性:就是拖拽的效果,拖拽时光标的样式。
    6. evnet.dataTransfer.setDragImage(odiv,0,0);  拖拽时的影像 是 odiv ,鼠标指在odiv的 0,0处(左上角)

    解决Firefox 浏览器下的问题:  

    必须设置 dataTransfer 对象的setData方法 才能拖拽图片以外的其他标签

    dataTransfer.setData() 方法 设置被拖数据的数据和值(key和 value)必须 是字符串,      dataTransfer.getData() 方法  根据 key 获取value的 值

    下面是一个简单的例子:

    <!DOCTYPE>
    <html>
    <head>
    	<meta charset="utf-8">
    	<style type="text/css">
    	li{
    		height: 20px;
    		 100px;
    		background: #e3f;
    		margin: 20px;
    		list-style: none;
    	}
    
    	div{
    		margin-top: 200px;
    		 100px;
    		height: 100px;
    		background: red;
    	}
    	</style>
    	<title>ni</title>
    	<script type="text/javascript">
    	window.onload = function(){
    		var j = 0;
    		var ul = document.getElementsByTagName("ul")[0];
    		var lis = document.getElementsByTagName("li");
    		var put = document.getElementById("put");
    		for (var i = 0; i < lis.length; i++) {
    			lis[i].index = i;
    			
    			lis[i].ondragstart  = function(ev){
    				var ev = ev||window.evnet;
    				ev.dataTransfer.setData("index",this.index);
    				this.style.backgroundColor = "#9f9";
    			}
    
    			lis[i].ondrag = function(){
    				this.style.backgroundColor = "#ff9";
    			}
    
    			lis[i].ondragend = function(){
    				this.style.backgroundColor = "#931";
    			}
    
    		};
    
    		put.ondragenter = function(){
    			this.style.backgroundColor = "black";
    		}
    
    		put.ondragover = function(ev){
    			ev.preventDefault();
    			this.style.backgroundColor = "blue";		
    		}
    
    		put.ondragleave = function(){
    			this.style.backgroundColor = "#931";		
    		}
    
    		put.ondrop = function(ev){
    			var ev = ev || window.evnet;
    			this.style.backgroundColor = "#999";			
    			ev.target.appendChild(lis[ev.dataTransfer.getData("index")]);			
    			//ul.removeChild(lis[ev.dataTransfer.getData("index")]);  加了这句话反而出问题,appendChild(e) 就是剪切的,当添加了子元素 e 后,会把原来的元素 e 给删除了
    			for (var i = 0; i < lis.length; i++) {
    						lis[i].index = i;
    					};		
    		}
    	}
    
    	</script>
    </head>
    <body>
    	<ul>
    		<li draggable="true">aaaaa</li>
    		<li draggable="true">bbbbb</li>
    		<li draggable="true">ccccc</li>
    	</ul>
    	<div id="put"></div>
    </body>
    

      

      

  • 相关阅读:
    切换JDK版本时修改JAVA_HOME环境变量不生效
    Java项目如何生成可执行jar包、exe文件
    Java去除字符串中空格的方法详解
    JAVA SWT的MessageBox对话框
    Java秒杀实战 (六) 服务级高并发秒杀优化(RabbitMQ+接口优化)
    DOM Event reference
    Chrome和Firefox的event显示
    What Causes Stock Prices to Change?
    Declaring variables without var keyword
    Do I have to return something in javascript function?
  • 原文地址:https://www.cnblogs.com/a-lonely-wolf/p/5313809.html
Copyright © 2020-2023  润新知