javascript - html5中的拖拽drop不是在盛放拖放元素的里面设置drop的监听?
问题描述
我想将A拖到B中,用了HTML5 的拖拽方法A是被拖拽的元素,B是打算盛放拖拽的元素在a中设置了dragstart,dragend在b中设置了dragenter,dragleave这是没有什么疑惑的。但是对于drop的监听,本以为是在B,这个盛放拖拽元素上设置的监听,可是一直触发不了
发现拖拽A,在A中松开鼠标的时候,可以触发A上的drop监听。
难道不是在B中监听元素的放入这个动作吗?
现在我将A拖入B再松开,触发的是dragenter,dragleave,dragend
但是如果我拖动A,在A上松开,就可以触发了drop了,并且e.target是我放在A上的一个元素
这是写的测试代码:
//拖拽功能的实现let dragElements = document.querySelectorAll(’.drag’);//被拖拽对象let elementDragged = null;let dropElements = document.querySelectorAll(’.drop’);//拖拽对象盛放容器for (let i = 0;i<dragElements.length;i++){ //开始拖拽 dragElements[i].addEventListener(’dragstart’,function (e) {e.dataTransfer.setData(’text’,$(this).find(’p’).text());elementDragged = this; });dragElements[i].addEventListener(’dragend’,function (e) {elementDragged = null;console.log(’dragend’,this,e.target) });dragElements[i].addEventListener(’drag’,function (e) {// console.log(’drag’) }); dragElements[i].addEventListener(’dragover’,function (e) {e.preventDefault();e.dataTransfer.dropEffect = ’move’;// console.log(’dragover’,this) }); dragElements[i].addEventListener(’drop’,function (e) {e.preventDefault();e.stopPropagation();let targetText = e.dataTransfer.getData(’text’);console.log(’drop’,e.target);return false; })}for(let i = 0;i<dropElements.length;i++){ dropElements[i].addEventListener(’dragenter’,function (e) {e.preventDefault();e.stopPropagation();console.log(’dragenter’,this) }); dropElements[i].addEventListener(’dragleave’, function(e) {e.preventDefault();e.stopPropagation();console.log(’dragleave’,this) });dropElements[i].addEventListener(’drop’,function (e) {e.preventDefault();e.stopPropagation();let targetText = e.dataTransfer.getData(’text’);console.log(’drop’,this);return false; })}
刚刚测试了下Firefox上,貌似在B上是可以监听到Drop的,但是chrome上却不能!请问这个有解决办法吗?
问题解答
回答1:dragElements.on(’dragend’,function (event) { elementDragged = null; console.log(’dragend’,this,event.originalEvent.target)});dropElements.on(’dragover’,function (e) { e.preventDefault(); e.originalEvent.dataTransfer.dropEffect = ’move’; console.log(’dragover’,this)});dropElements.on(’drop dragdrop’,function(event){ alert(’dropped’); // console.log(event.originalEvent.dataTransfer.getData(’text’))});dropElements.on(’dragenter’,function(event){ event.preventDefault(); $(this).html(’drop now’).css(’background’,’blue’);});dropElements.on(’dragleave’,function(){ $(this).html(’drop here’).css(’background’,’red’);});
最后用jquery封装了下,就可以了。但是。。。jquery的event必须得转成原生的event才能拿到dataTransfer对象比较。。。难受
回答2:dragover事件是添加到放置元素(b)不是拖动元素(a)的
相关文章:
1. nignx - docker内nginx 80端口被占用2. python3.x - python连oanda的模拟交易api获取json问题第五问3. docker - 如何修改运行中容器的配置4. javascript - js代码获取验证码倒计时问题5. 为什么我ping不通我的docker容器呢???6. docker-machine添加一个已有的docker主机问题7. 关于docker下的nginx压力测试8. angular.js - angular内容过长展开收起效果9. java - SSH框架中写分页时service层中不能注入分页类10. Java ImageIO.read(getClass()。getResource())返回null
