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

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

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

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

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

JavaScript

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

Q&A

解決済

2回答

1655閲覧

JavaScriptで複数選択リストの移動

hunata_konbi

総合スコア2

HTML5

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

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

JavaScript

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

0グッド

2クリップ

投稿2022/01/26 11:24

編集2022/01/26 15:55

JavaScript でリストから複数選択したものを上下ボタンで移動するコードを書きたいです。
ただ上下移動するものは書くことができましたが複数移動にするとうまく動作しません。
複数選択したものを上下に移動させる方法を教えてください。

実装したいもの
2と3を選択して下ボタンを押下
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>

<option value="1">1</option>
<option value="4">4</option>
<option value="2">2</option>
<option value="3">3</option>

3と5を選択して上ボタンを押した場合:

<option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> ↓ <option value="1">1</option> <option value="3">3</option> <option value="2">2</option> <option value="5">5</option> <option value="4">4</option> <option value="6">6</option>

HTML

1<table> 2 <tr> 3 <td> 4 <select id="item-list" size="8" multiple="multiple"> 5 <option value="1">1</option> 6 <option value="2">2</option> 7 <option value="3">3</option> 8 <option value="4">4</option> 9 <option value="5">5</option> 10 </select> 11 </td> 12 <td> 13 <input type="button" value="↑" onclick="move('up');"> 14 <br/> 15 <input type="button" value="↓" onclick="move('down');"> 16 </td> 17 </tr> 18</table>

JavaScript

1 2function move(act) { 3 var s = document.getElementById("item-list"); 4 5 if(s.selectedIndex == -1) return; 6 7 var opt = s.options[s.selectedIndex]; 8 9 var opts = s.options; 10 11 for (let i = 0; i < opts.length; i++) { 12 if (opts[i].selected){ 13 console.log(opts[i].value); 14 15 if (act == 'up') { 16 if (s.options[s.selectedIndex-1]) { 17 s.insertBefore(opt, s.options[s.selectedIndex-1]); 18 } 19 } 20 21 if (act == 'down') { 22 if (s.options[s.selectedIndex+1]) { 23 s.insertBefore(opt, s.options[s.selectedIndex+1].nextSibling); 24 } 25 } 26 } 27 } 28} 29

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

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

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

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

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

itagagaki

2022/01/26 11:50

まず提示のコードには未定義の変数の参照となっているものが複数あります。 まずは確認してからコードを貼ってください。
hunata_konbi

2022/01/26 13:54

ご指摘ありがとうございます。 修正しました。
itagagaki

2022/01/26 14:53

まだ文法的な間違いが散見され、曲がりなりにも動いていたコードを切り出したものとは思えません…。
hunata_konbi

2022/01/26 15:56

見よう見まねで書いてしまったものなので文法の勉強をして修正します。
guest

回答2

0

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 const opt=document.querySelectorAll('#item-list option'); 4 up.addEventListener('click',()=>{ 5 [...opt].filter(x=>x.selected).forEach(x=>{ 6 const prev=x.previousElementSibling; 7 if(prev && !prev.selected) x.parentNode.insertBefore(x,prev); 8 }); 9 }); 10 down.addEventListener('click',()=>{ 11 [...opt].filter(x=>x.selected).reverse().forEach(x=>{ 12 const next=x.nextElementSibling; 13 if(next && !next.selected) x.parentNode.insertBefore(next,x); 14 }); 15 }); 16}); 17 18</script> 19<select id="item-list" size="8" multiple="multiple"> 20<option value="1">1</option> 21<option value="2">2</option> 22<option value="3">3</option> 23<option value="4">4</option> 24<option value="5">5</option> 25</select> 26<hr> 27<input type="button" value="↑" id="up"> 28<input type="button" value="↓" id="down">

投稿2022/01/27 00:27

yambejp

総合スコア114779

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

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

hunata_konbi

2022/01/27 12:51

ありがとうございます。
guest

0

ベストアンサー

コメントで述べられた挙動ですと、以下のような手順で:

  • 上に動かす場合、s.optionsを昇順にループ
    • s.optoins[i] が選択済みであった場合
      • i0なら終了、そうでないならs.options[i]s.options[i - 1]s.insertBefore()で入れ替える
  • 下に動かす場合、s.optionsを降順にループ
    • s.options[i] が選択済みであった場合
      • is.options.length - 1 なら終了、そうでないなら s.options[i]s.options[i + 1]s.insertBefore() で入れ替える

以下は期待する動作と違うボツ案です。

複数選択の場合にどういう挙動が欲しいのかちょっとピンとこないのですが(1と3が選択されている場合は?)、選択されたoptionを上か下に集めるという挙動なら、以下のような手順でどうでしょうか。

  1. s.options を配列化する let opts = [...s.options];
  2. 上に集める場合、その配列を走査して未選択optionを順にs.appendChild()する。
  3. 下に集める場合、その配列を走査して選択済みのoptionを順にs.appendChild()する。

投稿2022/01/26 11:56

編集2022/01/26 14:39
int32_t

総合スコア20845

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

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

hunata_konbi

2022/01/26 13:51

ご回答ありがとうございます。 1と3が選択されている場合に上ボタンを押したら1より上はないので動かない想定です。 3と5を選択して上ボタンを押した場合には下記のようにしたいです。 <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> ↓ <option value="1">1</option> <option value="3">3</option> <option value="2">2</option> <option value="5">5</option> <option value="4">4</option> <option value="6">6</option> その配列を走査というのはif文で回すイメージでしょうか。 初めてコードを書くので初歩的な質問で申し訳ございません。
int32_t

2022/01/26 14:40

最初の回答は期待する動作ではないようなので、回答を更新しました。 > その配列を走査というのは for などで全要素を処理しろということです。
hunata_konbi

2022/01/26 15:38

ご回答ありがとうござます。 明日試してみます。 また質問に対してもお答えくださりありがとうございます。
hunata_konbi

2022/01/27 12:50

できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問