>  기사  >  웹 프론트엔드  >  H5 드래그 앤 드롭 API 기본 사항

H5 드래그 앤 드롭 API 기본 사항

大家讲道理
大家讲道理원래의
2017-05-28 11:07:392051검색

오해하지 마세요. 이 글은 바닥을 걸레질하는 방법에 관한 것이 아닙니다. "javascriptEssence"를 본 친구들은 드래그 앤 드롭을 구현하는 과정이 상대적으로 복잡하다는 것을 알아야 합니다. 이제는 H5의 새로운 드래그 앤 드롭 API를 사용하여 매우 편리하게 드래그 앤 드롭 효과를 얻을 수 있습니다. 최근 정원에서 "HTML5 고급 시리즈: 드래그 앤 드롭 정렬을 실현하는 드래그 앤 드롭 API"라는 기사를 쓴 동료 정원사를 만났습니다. 마스터가 아님) Xiong 씨는 이에 비해 모든 정원 친구들이 뭔가를 얻을 수 있기를 바랍니다. 1. 간단한 예 - 땅에 있는 돌 몇 개를 집으세요

 

    地上有石子,捡几个吧
    
    
        
        
        
    
    
    我是篮子    
    
    我是地
    
        石子
        石子
        石子
        石子
        石子
        石子
        石子
        石子
        石子
        石子


                                                                                                  ery 땅에 있는 자갈 몇 개, 땅에 있는 돌 몇 개를 집을 수 있나요? )

 

다음은 드래그 앤 드롭을 구현하는 방법을 보여주는 간단한 예입니다. 그러면 위의 데모에서 일부

속성 및 메서드

의 사용법을 추측할 수 있습니다. ? 어떤가요? 이러한 속성은 무엇을 의미하나요? 아래에서 하나씩 오세요.

2. 드래그 앤 드롭을 구현하는 일반적인 단계

 1. 드래그 가능한 요소 찾기

모든 사람이 Big Bear를 호출하지 않는 것처럼 모든 요소를 ​​드래그할 수 있는 것은 아닙니다. img 및 a 요소는 기본적으로 드래그 가능하며, 다른 요소는 기본적으로 드래그 가능하지 않습니다. 이때 draggable=true를 추가하여 드래그 가능하게 만들 수 있습니다.

 

<p draggable=&#39;true&#39;></p>


 

2. 드래그 앤 드롭 관련

이벤트 처리

모든 관련 이벤트는 다음과 같습니다. (출처: http://www.cnblogs.com/linxin/ p/6794542.html )  소스 객체

:

dragstart: 소스 객체가 드래그 앤 드롭을 시작합니다.

  • drag: 소스 개체의 드래그 앤 드롭 프로세스 중입니다.

  • drag

    end

    : 소스 개체의 드래그 앤 드롭이 종료됩니다.
  •  프로세스 객체:

dragenter: 소스 객체가 프로세스 객체의 범위에 들어가기 시작합니다.

  • dragover: 소스 개체가 프로세스 개체의 범위 내에서 이동합니다.

  • dragleave: 소스 개체가 프로세스 개체의 범위를 벗어납니다.

  •   대상 개체:

drop: 원본 개체를 대상 개체에 드래그 앤 드롭합니다.

  • 테스트를 사용하여 이러한 이벤트가 언제 트리거되는지, 이벤트 개체가 무엇인지 확인할 수 있습니다.

     

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>testEvents</title>
    <style type="text/css">
        .source{
            width: 50px;
            height: 50px;
            border: 1px solid red;
        }
        .process{
            width: 100px;
            height: 100px;
            border: 1px solid black;
            margin-top: 10px;
        }
        .dest{
            width: 100px;
            height: 100px;
            border: 1px solid green;
            margin-top: 10px;
        }
    </style></head><body>
    <p class="source" id="source" draggable="true"></p>
    <p class="process" id="process"></p>
    <p class="dest" id="dest"></p>
    <script type="text/javascript">
    window.onload=function(){        var source = document.getElementById("source");        var process = document.getElementById("process");        var dest = document.getElementById("dest");        var sourceEle;

        source.addEventListener("dragstart",function(e){
            console.log("source dragstart");
            console.log(e);
            sourceEle = e.target;            var dt = e.dataTransfer;
            dt.effectedAllowed = "all";
        },false);

        process.addEventListener("dragenter",function(e){
            console.log("process dragenter");
            console.log(e);
        },false);

        process.addEventListener("dragover",function(e){
            console.log("process dragover");
            console.log(e);
        },false);

        process.addEventListener("dragleave",function(e){
            console.log("process dragleave");
            console.log(e);
        },false);

        source.addEventListener("drag",function(e){
            console.log("source drag");
            console.log(e);
        },false);

        dest.addEventListener("dragend",function(e){
            console.log("dest dragend");
            console.log(e);
            e.preventDefault();
        },false);

        dest.addEventListener("drop",function(e){
            console.log("dest drop");
            console.log(e);
            dest.appendChild(sourceEle);
            e.preventDefault();
            e.stopPropagation();
        },false);

        document.ondragover = function(e){e.preventDefault();}
        document.ondrop = function(e){e.preventDefault();}
    }    </script></body></html>


이 예제는 드래그 앤 드롭 프로세스와 관련된 이벤트를 나열합니다. 여기서는 콘솔을 확인하여 트리거 시퀀스와 이벤트 개체를 확인할 수 없습니다. 이벤트.

3. 중요한 객체, DataTransfer 객체

 엄밀히 말하면 클래스라고 합니다. 이 클래스는 드래그 앤 드롭할 때마다 인스턴스화되며 dataTransfer 속성에 저장됩니다. 이벤트 객체의. 그 속성과 방법은 아래 표에 나와 있습니다(출처: http://www.cnblogs.com/ijjyo/p/4316232.html)

 요약해 주셔서 감사합니다. 여러분에게서 많은 것을 얻었습니다. 감사합니다.

몇 가지 간단한 테스트를 해보겠습니다.

effectAllowed 및 dropEffect

에 대해서는 여기서 전자를 effectAllowed로 설정하고

드롭다운 목록

을 사용하여 선택합니다.

  

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>testEvents</title>
    <style type="text/css">
        .source{
            width: 50px;
            height: 50px;
            border: 1px solid red;
        }
        .process{
            width: 100px;
            height: 100px;
            border: 1px solid black;
            margin-top: 10px;
        }
        .dest{
            width: 100px;
            height: 100px;
            border: 1px solid green;
            margin-top: 10px;
        }
    </style></head><body>
    <select id="dpe">
        <option value="copy">copy</option>
        <option value="move">move</option>
        <option value="link">link</option>
        <option value="none">none</option>
    </select>
    <p class="source" id="source" draggable="true"></p>
    <p class="process" id="process"></p>
    <p class="dest" id="dest"></p>
    <script type="text/javascript">
    window.onload=function(){        var source = document.getElementById("source");        var process = document.getElementById("process");        var dest = document.getElementById("dest");        var dpe = document.getElementById("dpe");        var dpev;

        dpe.onchange = function(){
            dpev = this.value;
        }        var sourceEle;

        source.addEventListener("dragstart",function(e){
            console.log("source dragstart");
            console.log(e);
            sourceEle = e.target;            var dt = e.dataTransfer;
            dt.effectedAllowed = "all";
        },false);

        dest.addEventListener("dragend",function(e){
            console.log("dest dragend");
            console.log(e);
            e.preventDefault();
        },false);

        dest.addEventListener("drop",function(e){
            console.log("dest drop");
            console.log(e);
            dest.appendChild(sourceEle);
            e.preventDefault();
            e.stopPropagation();
        },false);

        document.ondragover = function(e){
            e.dataTransfer.dropEffect = dpev;
            e.preventDefault();
        }
        document.ondrop = function(e){e.preventDefault();}
    }    </script></body></html>


  우분투

chr

ome에서 테스트해본 결과 모두 똑같은데 없음으로 설정하면 드래그가 안되네요. 시스템.

 

setData() 및 getData() 메소드에 대하여

 이 두 가지는 데이터 교환과 관련된 메소드입니다. 전자는 두 개의 매개변수를 전달하며, 두 번째 매개변수는 MIME 유형

string입니다. 또는 MIME 유형인 매개변수를 전달합니다. 사용 가능한 MIME 유형은 text/plain, text/html, text/xml

, text/uri-list입니다.

  테스트 케이스, 메뉴 항목을 노트북으로 드래그합니다.  

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>点菜</title>
    <style type="text/css">
        .menu{
            width: 200px;
            height: 300px;
            border: 1px solid red;
            margin-right: 10px;
            float: left;
        }
        .record{
            width: 200px;
            height: 300px;
            border: 1px solid black;
            margin-right: 10px;
            float: left;
        }
    </style></head><body>
    <ul class="menu" id="menu">
        <li draggable="true">糖醋排骨</li>
        <li draggable="true">青椒肉丝</li>
        <li draggable="true">武昌鱼</li>
        <li draggable="true">手撕包材</li>
        <li draggable="true">千叶豆腐</li>    
    </ul>
    <ul class="record" id="record">
        
    </ul>
    <script type="text/javascript">
        window.onload = function(){            var menu = document.getElementById("menu");            var record = document.getElementById("record");

            menu.addEventListener("dragstart",function(e){                var dt = e.dataTransfer;                var tar = e.target;                if(tar.tagName=="LI"){
                    dt.setData("text/plain",tar.innerHTML);
                }
                dt.effectedAllowed = "all";
            },false);

            record.addEventListener("drop",function(e){                var li  = document.createElement("li");
                li.appendChild(document.createTextNode(e.dataTransfer.getData("text/plain")));
                record.appendChild(li);
                e.stopPropagation();
            },false);

            record.addEventListener("dropend",function(e){
                e.preventDefault();
            },false);

            document.addEventListener("dragover",function(e){e.preventDefault()},false);

            document.addEventListener("drop",function(e){e.preventDefault()},false);
        }    </script></body></html>


  关于setDragImage(Element img,long x,long y)

   这个方法是设置拖放时的图标的,第一个参数表是图标元素,第二个表示相对与光标的水平偏移,第三个是垂直的。

  还是前面的例子,在dragstart事件添加下面的代码,拖动时你会发现一只很大的手(不要被吓到);


var img = document.createElement("img");
                img.src = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1493802056263&di=232de2c30491e19f32833669ad5a67ae&imgtype=0&src=http%3A%2F%2Fstatic.freepik.com%2Ffree-photo%2Fone-finger_318-10333.jpg";
                dt.setDragImage(img,10,10);


 

 四、关于拖放数据传递

  上面的例子已经谈到了拖放的数据传递方法,这里在总结一下。

  1、通过dataTransfer的setData()和getData()方法传递

  2、通过闭包的方法,请参考开篇的例子。

五、总结

  HTML5的拖放api非常简洁实用,为我们省去了很多麻烦,如果没有它,我们可能需要通过mousedownmousemove等等事件才能实现上述功能。本文较为详细的介绍了相关api,希望对你有所帮助。关于拖放api的应用大家可以参看下面链接的文章,他做了一个拖放排序,这是一个比较常见的应用场景。

  大~熊同学的粉丝数正在逼近三位数,感谢各位园友的支持,大~熊会继续努力的! 

  参考:

  • http://www.cnblogs.com/ijjyo/p/4316232.html 

  • http://www.cnblogs.com/linxin/p/6794542.html

 

 

위 내용은 H5 드래그 앤 드롭 API 기본 사항의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:HTML5 웹 스토리지다음 기사:HTML5 웹 스토리지