質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

div

HTMLの<div>タグです。<div>要素は特に意味を持っていません。ひとかたまりのコンテンツに使用されるか、(セマンティックとして)他の要素では記述できないコンテンツに使用されることが多いです。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

226閲覧

ドラッグアンドドロップで配列の中の要素を一つずつとりだす

irebasunglass

総合スコア8

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

div

HTMLの<div>タグです。<div>要素は特に意味を持っていません。ひとかたまりのコンテンツに使用されるか、(セマンティックとして)他の要素では記述できないコンテンツに使用されることが多いです。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2023/09/06 10:21

実現したいこと

複数の要素を一つずつドラッグアンドドロップさせることです
例えば画像の一森純を左の空欄に入れて
イメージ説明
下記のような状態にしております
イメージ説明
ところが一回目のドロップエンドを終えると二回目のドロップスタートの際、一回目の要素を含めてドロップされてしまいます。
ですので三回目、四回目とだんだん下記のように一度に複数の要素がドロップされていきます。
イメージ説明

|:--|:--:|--:| |||| ### 前提 前提として要素をひとつずつとりだしたいため、ドロップエンドをしたら 前回分の要素をドロップさせたくない(ドラッグした分だけをドロップしたいです) ### 該当のソースコード const players_list = document.getElementById("players_list"); for(let i=0;i< players.length; i++) { if(i%2==1) { const player = document.createElement('div'); player.classList.add('ran'); player.textContent = players[i]; players_list.appendChild(player); } } const urawa = document.getElementById('team_box'); let ct = 0; function teams_box(e ,list, team) { e.addEventListener('click',() => { if(ct == 0) { list = document.createElement('div'); list.classList.add('teams_ran'); document.body.appendChild(list);   listというdivに要素をドロップ ct = 1; //------------------------------ const player = document.querySelectorAll('.ran'); //ドラッグ対象 const f_players = [].slice.call(player); for(const player of f_players) { player.setAttribute('draggable','true'); player.addEventListener('dragstart',dragstart) function dragstart() { setTimeout(() => { player.className = 'invisible'; }, 0); player.addEventListener('dragend', dragend); let in_p = player; list.addEventListener('drop',() => { list.appendChild(in_p); }); } function dragend() { player.className = 'ran'; player.removeEventListener('dragend', dragend); ・・・ ① } list.addEventListener('dragover', dragover); function dragover(e) { e.preventDefault(); } } ### 試したこと player.removeEventListener('dragend', dragend); ・・・ ① 上記をdragend関数で使うことによって強制的に、一回ごとにイベントを終了させようとしましたががうまくいきません。 よろしくお願いいたします。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

javascript

1<style> 2.wrap{ 3display:flex; 4} 5.list{ 6height:300px; 7width:200px; 8 list-style:none; 9padding:0; 10} 11.list li{ 12 margin-top:10px; 13 background-Color:white; 14 border-radius:10px; 15 text-align:center; 16} 17#newlist{ 18background-Color:lightgray; 19} 20#orglist{ 21background-Color:black; 22} 23</style> 24<script> 25const dragobj={}; 26["dragenter","dragover"].forEach(x=>{ 27 document.addEventListener(x,({target})=>{ 28 if(target.matches('.list')){ 29 event.preventDefault(); 30 } 31 }); 32}); 33document.addEventListener("drag",({target})=>{ 34 dragobj.target=target; 35}); 36document.addEventListener("drop",({target})=>{ 37 target.appendChild(dragobj.target); 38 dragobj.target=null; 39}); 40</script> 41<div class="wrap"> 42<ul id="newlist" class="list"> 43</ul> 44<ul id="orglist" class="list"> 45<li draggable="true">a</li> 46<li draggable="true">b</li> 47<li draggable="true">c</li> 48<li draggable="true">d</li> 49<li draggable="true">e</li> 50<li draggable="true">f</li> 51</ul> 52</div>

投稿2023/09/07 00:35

yambejp

総合スコア114883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

irebasunglass

2023/09/07 04:45

ありがとうございした。 無事に一つずつ、ドロップすることができました。一つ疑問があるのですが、イベントリスナーの第一引数でforEachの仮引数を、指定するところが初めてであり内容がわかりませんでした。イベントハンドラ以外でも対象になるということなのでしょうか?
yambejp

2023/09/07 04:47

>イベントリスナーの第一引数でforEachの仮引数を、指定するところ ["dragenter","dragover"]のところですよね? コールバックが同じなので配列で共通化しただけで実際には document.addEventListener("dragenter"・・・ }); document.addEventListener("dragover"・・・ }); と冗長に書いても問題ありません
guest

0

js

1list.addEventListener('drop',() => { 2 list.appendChild(in_p); 3});

この drop イベントリスナが登録解除されていないので、2回目のドロップで1回目のイベントリスナも呼ばれてしまってますね。

少ない変更で動くようにするなら、in_p をグローバル変数にして、上記コードをループの外に出すのはいかがでしょうか。

投稿2023/09/07 00:32

int32_t

総合スコア20909

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

irebasunglass

2023/09/07 04:46

ありがとうございした。参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問