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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2876閲覧

jQuery で <select multiple> をコピーしたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/09/03 15:47

編集2018/09/03 16:07

xxx 123
yyy 345
zzzzz 78901

みたいに2つのデータを表敬式に表示して
ドラッグや Ctrl+クリックで複数行選択できるセレクトボックスを作りたいのですが
<select multiple> だとボックスの中にスタイルをあてられず
raw text しか出力できず見栄えが悪いので

2つのセレクトボックスを横に並べてスクロール位置と選択状態を一致させることで実現しようと思っています

ただ jQuery になれていなくて選択状態をうまくとりだせません

<div style="display:flex"> <select multiple id="left"> <option value="1">111</option> <option value="2">222</option> <option value="3">333</option> </select> <select multiple id="right"> <option value="1">111</option> <option value="2">222</option> <option value="3">333</option> </select> </div> <script> $('#left').change(function() { src = $('#left > option'); dst = $('#right > option'); src.each((o) => { console.log(o); $("#right [value="+ o.val() +"]").attr("selected", o.attr("selected")) }); }); </script>

というようなサンプルをかいてみたのですが
Uncaught TypeError: o.val is not a function
というエラーが出ます

意図としては value が同じ位置の option のattr の selected 値を代入しようとしてるのですがこの書き方のどこが悪いのでしょうか

あと片方をスクロールしたときもう一方のスクロール位置を一致させるのは簡単にできるでしょうか

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

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

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

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

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

m.ts10806

2018/09/03 22:26

プログラムコード(およびエラーメッセージ)は質問内容としては最も重要な部分であるため、見やすくしていただけると助かります。<code>ボタン押下→「コード」部分にコードを貼り付け→「ここに言語を入力」に対象言語名記入(エラーメッセージの場合は不要)の手順で「コードハイライト化」してください。(質問編集画面ではリアルタイムでプレビューが表示されるので見ながら調整してください)
guest

回答1

0

ベストアンサー

こんにちは。

意図としては value が同じ位置の option のattr の selected 値を代入しようとしてるのですがこの書き方のどこが悪いのでしょうか

each() の仕様は、以下

https://api.jquery.com/each/

.each( function )

function
Type: Function( Integer index, Element element )

A function to execute for each matched element.

と記載されているとおり、 each() に与える関数の第1引数にはインデクスが入ってきます。ですので、以下の部分

javascript

1src.each((o) => { 2 console.log(o); 3 $("#right [value="+ o.val() +"]").attr("selected", o.attr("selected")); 4});

の、 each((o) => としているところは、each((index,o) => かなと思います。上記だと o にインデクスの整数が入ってきますが 整数のoo.val() というメソッドは持っていないために

Uncaught TypeError: o.val is not a function

というエラーが発生することになります。

あと片方をスクロールしたときもう一方のスクロール位置を一致させるのは簡単にできるでしょうか

scrollTop を使えばできます。

  

参考までに、以下に要件を満たすサンプルを作ってみました。

https://jsfiddle.net/jun68ykt/dj3cvq91/46/

上記の jsFiddleに上げたコードは、ご質問に挙げられているコードとはちょっとやり方が違っていますが、要点は以下です。

  • 左右の <select> それぞれに 30個の <option> を作ります。(スクロールさせるため)

  

  • 左右いずれの <select> でも change が発生したら、他方の<select> の選択状態の<option>を同じにします。方法としては、以下のようにしています。

javascript

1$(`#${otherSelectId}`).val($(this).val());

上記にて、コピー元<select>である $(this).val() で取得できる配列を、コピー先<select>.val(values) で与えて、選択状態になる値を更新しています。

  • 左右いずれの <select> でも scroll が発生したら、他方の<select>も同じ位置にスクロールさせます。

以上、参考になれば幸いです。


追記

回答にサンプルとして挙げた jsFiddle のコードを、 FireFox v61 で開くと問題なく動作しましたが、Chrome v68 だと、スクロール後に <option>をクリックしたときにスクロール位置が勝手に移動してしまい、違和感のある動作になってしまうことがあります。(ブラウザによって挙動が異なるという意味では、ちょっと微妙なやり方なのかもしれません。)

投稿2018/09/03 22:19

編集2018/09/04 00:26
jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2018/09/04 03:14

jQuery の $each は第1引数がindexだったんですね… map や forEach と混同してました… わざわざコードまで書いていただいてわかりやすい回答ありがとうございました ただ自分でも試してみたんですがスクロールした後の選択で位置がずれるのがけっこう大きな問題なのでこの方法では実現が難しそうなので別の方法を考えることにします option の中には HTML がかけないけど option 自体にはスタイルがきくみたいなので 2列に並べて偶数番目奇数番目を教えていただいた方法で連動させれば実現できるかなと スクロールバーも右端だけになるので見栄えもよくなりそうだし
jun68ykt

2018/09/04 06:16

> 混同してました… 紛らわしいですね、 JS標準のforEach に慣れると、JQuery のeach もそのように書いてしまいますね。私も時々やります。 > 別の方法を考えることにします よい回答のコードが書けた!と思ったのですが、Chrome での動きが微妙なのを発見して、orz って感じでした。。。 > ・・・見栄えもよくなりそうだし とりあえず、前に進めそうでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問