美文网首页
html5之使用拖放

html5之使用拖放

作者: 旧友_1 | 来源:发表于2016-11-18 16:38 被阅读511次

    简单讲解一下思路:
    话不多说,先贴dom结构代码,

    <body>
    <div id="dragsource">
        <p dir="ltr" draggable="true" id="zuotoyou">被拖动的元素左右1</p>
        <p dir="rtl" draggable="true" id="youtozuo">被拖动的元素右左2</p>
    
    <!-- 释放区 -->
        <div id="target">
            <p>dom元素拖动到这</p>
        </div>
    
        <div id="target1" style="border:1px;width: 100px;height: 100px;background-color: #eeeeee;">
            文件拖动到这
        </div><!-- end释放区 -->
    
        <table id="table">
            <!-- 显示文件相关信息 -->
        </table>
    
    </div>
    </body>```
    第一步,创建要拖动的来源项目,增加属性draggable="true"让元素可以拖动。
    
    <p  draggable="true" id="zuotoyou">被拖动的元素</p>
    
    第二步,处理拖动事件,这个简单,看英文名就知道是什么意思。
    dragsrart:在元素开始被拖动时触发,
    dragend:在元素开始拖动完成时触发,
    drag:元素被拖动的过程中反复触发。
    e.dataTransfer.setData('draggedID',e.target.id);后面会讲先不用管。
    

    //处理拖动
    var dragsource = document.getElementById('dragsource');
    dragsource.ondragstart = function(e){
    e.dataTransfer.setData('draggedID',e.target.id);
    console.log('dragsource');
    }
    dragsource.ondragend = function(e){
    console.log('dragend');
    }

    dragsource.ondrag = function(e){    
        //console.log(e.x);//拖动过程中每几毫秒执行一次
    }
    
    第三步,创建释放区,接收释放
    dragenter:被拖动元素进入释放区时触发,
    dragover:被拖动元素进入释放区移动时触发,
    dragleave:拖动元素没有放下就从释放区离开,
    drop:被拖动元素在释放区放下时触发
    

    //创建释放区
    var target = document.getElementById('target');
    target.ondragenter = handleDrag;//被拖动元素进入释放区时触发
    target.ondragover = handleDrag;//被拖动元素进入释放区移动时触发
    function handleDrag(e){
    //通知浏览器不要执行浏览器的默认动作(浏览器默认是拒绝接受任何拖放项目的)
    e.preventDefault();
    }
    target.ondragleave = function(e){
    console.log('拖动元素没有放下就从释放区离开');
    }
    //被拖动元素在释放区放下时触发
    target.ondrop = function(e){
    var draggedID = e.dataTransfer.getData('draggedID');
    console.log('draggedID:',draggedID);
    var newElem = document.getElementById(draggedID).cloneNode(true);//true还克隆了其子元素,false只克隆其自身
    console.log(newElem);
    target.innerHTML = '';
    target.appendChild(newElem);

    }
    
    DataTransfer对象,用于存放数据,你可以先理解为android的sharedperference.
    setData(<format>,<data>)设置指定格式的数据;
    getData(<format>)得到数据;
    files 返回文件列表
    感觉废话太多了,直接上完整代码,注释够详细了!
    

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title></title>
    </head>
    <body>
    <div id="dragsource">
    <p dir="ltr" draggable="true" id="zuotoyou">被拖动的元素左右1</p>
    <p dir="rtl" draggable="true" id="youtozuo">被拖动的元素右左2</p>


    <div id="target">
    <p>dom元素拖动到这</p>
    </div>

    <div id="target1" style="border:1px;width: 100px;height: 100px;background-color: #eeeeee;">
        文件拖动到这
    </div><!-- end释放区 -->
    
    <table id="table">
        <!-- 显示文件相关信息 -->
    </table>
    

    </div>
    </body>
    </html>
    <script type="text/javascript">
    //var draggedID;//利用全局变量获取被拖动元素的id,以便克隆

    //创建释放区
    var target = document.getElementById('target');
    target.ondragenter = handleDrag;//被拖动元素进入释放区时触发
    target.ondragover = handleDrag;//被拖动元素进入释放区移动时触发
    function handleDrag(e){
    //根据数据过滤被拖动项目,Chrome过滤不可用,因为dragenter和dragover里getData方法无效!
    console.log('handleDrag:',e.dataTransfer.getData('draggedID'));
    if(e.dataTransfer.getData('draggedID') == 'zuotoyou'){
    //通知浏览器不要执行浏览器的默认动作(浏览器默认是拒绝接受任何拖放项目的)
    e.preventDefault();
    }
    }
    target.ondragleave = function(e){
    console.log('拖动元素没有放下就从释放区离开');
    }
    //被拖动元素在释放区放下时触发
    target.ondrop = function(e){
    var draggedID = e.dataTransfer.getData('draggedID');
    console.log('draggedID:',draggedID);
    var newElem = document.getElementById(draggedID).cloneNode(true);//true还克隆了其子元素,false只克隆其自身
    console.log(newElem);
    target.innerHTML = '';
    target.appendChild(newElem);

    }
    

    //处理拖动
    var dragsource = document.getElementById('dragsource');
    dragsource.ondragstart = function(e){
    console.log(e);
    //draggedID = e.target.id;
    e.dataTransfer.setData('draggedID',e.target.id);
    console.log('dragsource');
    }
    dragsource.ondragend = function(e){
    console.log(e);
    console.log('dragend');
    }

    dragsource.ondrag = function(e){    
        //console.log(e.x);//拖动过程中每几毫秒执行一次
    }
    

    //DataTransfer 像释放区传输数据
    //eg:不使用全局变量,如上

    //拖拽文件
    //创建释放区
    var target1 = document.getElementById('target1');
    target1.ondragenter = handleDrag;//被拖动元素进入释放区时触发
    target1.ondragover = handleDrag;//被拖动元素进入释放区移动时触发
    function handleDrag(e){
    //通知浏览器不要执行浏览器的默认动作(浏览器默认拒绝接受任何拖放项目)
    e.preventDefault();
    }
    target1.ondragleave = function(e){
    console.log('拖动元素没有放下就从释放区离开');
    }
    //被拖动元素在释放区放下时触发
    target1.ondrop = function(e){
    var fileList = e.dataTransfer.files;//fileList是数组
    console.log(fileList);
    table.innerHTML = '<tr><th>Name</th><th>type</th><th>size</th></tr>';
    for(var i = 0 ;i<fileList.length;i++){
    var row = '<tr><td style="border:1px black solid;">'+fileList[i].name+'</td><td>'+fileList[i].type+'</td><td>'+fileList[i].size+'</td></tr>';
    table.innerHTML +=row;
    }
    }
    </script>

    最后是不是可以做个批量的文件拖拽上传呢?
    

    if(fileList || true){
    for (var i = 0; i<fileList.length; i++) {
    formData.append('filename'+i,fileList[i]);
    }
    }

    动手吧,不试试怎么知道!
    

    相关文章

      网友评论

          本文标题:html5之使用拖放

          本文链接:https://www.haomeiwen.com/subject/ofqspttx.html