H5 ドラッグ アンド ドロップ API の基本

大家讲道理
リリース: 2017-05-28 11:07:39
オリジナル
2108 人が閲覧しました

誤解しないでください、この記事は床のモップ掛けの方法についてではありません。 「javascriptEssence」を見た友人は、ドラッグ アンド ドロップの実装プロセスが比較的複雑であることを知っているはずです。今では、H5 の新しいドラッグ アンド ドロップ API を使用して、非常に便利にドラッグ アンド ドロップ効果を実現できます。最近、庭で「HTML5 上級シリーズ: ドラッグ アンド ドロップの並べ替えを実現するドラッグ アンド ドロップ API」という記事を書いた仲間の庭師に会いました。これはまさに初心者としての達人です。マスターではありません)、Xiong氏はこれに比べて、すべての庭の友人がそこから何かを得ることができることを願って、基本的な章を立ち上げました。 1. 簡単な例 - 地面に落ちている小石をいくつか拾います

    地上有石子,捡几个吧
    
    
        
        
        
    
    
    我是篮子    
    
    我是地
    
        石子
        石子
        石子
        石子
        石子
        石子
        石子
        石子
        石子
        石子
ログイン後にコピー


~は、ドラッグ アンド ドロップの実装方法を示す簡単な例です。次に、いくつかの
プロパティとメソッド

の機能はどのようなものなのかという疑問が生じます。これらの属性は何を意味するのでしょうか?以下からお一人ずつお越しください。

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>
ログイン後にコピー
ubuntu chr

ome でテストしたところ、すべて同じであることがわかりましたが、none に設定されている場合はドラッグできません。システム。


setData()メソッドとgetData()メソッドについて


これら2つのメソッドはデータ交換に関連しており、前者は2つのパラメータを渡します

文字列

、後者はデータです。または、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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート