1. ドラッグされるイベントは onmousedown、onmousemove、onmouseup の 3 つです
2. onmousemove イベントでは、ドラッグされた要素の位置の変更が処理されます。実際には、単刀直入に言うと、要素が必要な距離です。 move は、マウスの 2 つの動きの間の距離です。
3. setCapture と releaseCapture も含まれます。これは、移動された要素が常にフォーカスされるようにすることです。
これまでの理解は、JS ドラッグ テクノロジ -- setCapture の実装について を参照してください。その後、作業要件の改善に伴い、すべての作業はクロスブラウザーで行う必要があります。そこで、いくつかのオープンソースコードを参照して再考し、実装しました。
一般的なアイデアは次のステップに分析できます。1 つずつ説明します。
1. 引きずるために動いているのでしょうか?もちろん、Google マップとは異なり、その目的は、移動するたびに現在の空間座標を計算して地理情報をロードすることです。そこで、ここでいくつかの一般的なイベントを設計しました。以下はイベント リスト
onDragStart です。要素がドラッグされるとき、このイベントを登録すると、トリガーされたときに 2 つのパラメーター x と y を受け取ります。これらは、ドラッグされたときに移動された要素の座標です。
onDrag: 要素のドラッグ プロセス中に、このイベントを登録すると、トリガーされたときに 2 つのパラメーター nx と ny を受け取ります。
onDragEnd: これを登録すると、要素が終了したとき。イベントがトリガーされると、2 つのパラメーターを受け取ります。パラメーター x と y はそれぞれ、移動された要素の現在の座標です。
2. 以前は、onmousedown イベントを誰にバインドする必要がありましたか?後で、これが非常に柔軟性に欠けていることがわかりました。無関係な要素を指定すると、それらの要素を同時にドラッグできるようになりました。
3. 移動プロセス中に要素に常にフォーカスがあるようにするにはどうすればよいですか?クロスブラウザなので、setCapture などのメソッドは使用しません。これは、要素の移動プロセス中にフォーカスがない理由です。主な理由は、ドラッグされた要素に onmousemove イベントを登録しているためです。これは必要ないので、要素が onmousedown イベントをトリガーするときに、onmousemove および onmouseup イベントをドキュメントに直接登録して、マウスがどこに移動してもフォーカスが存在するようにします。
ここまで述べたら、コード構造を直接見てみましょう。