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

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

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

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

HTML

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

Q&A

解決済

1回答

1626閲覧

selectタグのmultipleを使用せずにTypescriptで同様の動作になるよう実装したい

BadXO

総合スコア6

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

HTML

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

0グッド

0クリップ

投稿2021/10/27 08:28

編集2021/10/27 09:17

前提
Angular 12
TypeScript 4.3.5

selectタグでmultiple属性を付与すると、マウスを押したままドラッグすると複数選択できるフォームを実装できます。
このフォームをdivタグとTypesscriptのイベントを使用してどうにか実装できないか検討しています。

html

1<select multiple> 2 <option value="値A">選択肢A</option> 3 <option value="値B">選択肢B</option> 4 <option value="値C">選択肢C</option> 5</select>

イメージ説明

 行なったこと
・ 下記のような形でmousedown, mouseover, mouseupのマウスイベントを利用して実装してみたがうまく実装できなかった。

<div (mouseover)="mouseover($event)"> <div value="値A">選択肢A</div> <div value="値B">選択肢B</div> <div value="値C">選択肢C</div> </div>

何かご存知の方、もしくは実装したことがある方などなんでも良いのでコメント頂けるとありがたいです。

追記
失礼致しました。正確な実装はこちらになります。

View側

HMML

1<div *ngFor="let value of array"> 2 <div (mouseover)="mouseover(value)">{{ value }}</div> 3</div>

Component側
コンポーネント側では以下のプロパティとメソッドを定義しています。

array = ['選択肢A', '選択肢B', '選択肢C']; mouseover(event: any) { console.log(event); }

イベントが発火した場合、メソッドが受け取るものはこのようになります。
イメージ説明

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

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

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

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

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

maisumakun

2021/10/27 09:03

> 下記のような形でmousedown, mouseover, mouseupのマウスイベントを利用して実装してみたがうまく実装できなかった。 イベントの中身はどのようなものだったのですか?
BadXO

2021/10/27 09:16

意図とあっていないかもしれないですが、追記いたしました。
guest

回答1

0

ベストアンサー

実装したことありますが、まあ面倒ですね。

親のdiv要素で mousedown, mousemove, mouseup のイベントを聞き、

  • mousedown で選択開始アイテムを記録し、選択モードを開始する
  • mousemove で現在のアイテムから選択開始アイテムの間を選択状態にする
  • mouseup などで選択開始アイテムをクリアし、選択モードを終了する

というのが基本的な動作ですが、他にもイロイロと考慮することがあります。

mouseup以外にも様々な条件で選択モードを終了する必要があります。たとえばマウスボタンを押したままブラウザウィンドウのフォーカスがなくなるとか。

ドラッグ中に選択範囲を縮めたときにもともとの選択状態を復元するなら、選択開始時点の状態を保存しておく必要があります。

アイテムがたくさんあってスクロール可能なら、マウスポインタが端まで来たら自動スクロールさせた方が自然な動きでしょう。

投稿2021/10/27 16:04

編集2021/10/27 16:10
int32_t

総合スコア20878

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

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

BadXO

2021/10/27 23:56

ご回答ありがとうございます。難しそうですが、一度実装してみます。 選択モードの開始や終了はフラグのようなもので実装するイメージでしょうか?
BadXO

2021/10/28 00:00 編集

下記のようなものをイメージしております。 ・mousudownでenableSelect = true, mouseupでenableSelect = falseのようにフラグを実装する。 ・enableSelect = true であればmousemoveの処理が実行される
int32_t

2021/10/28 01:02

そんな感じで大丈夫だと思います。
BadXO

2021/10/28 08:10

ありがとうございます。 >マウスポインタが端まで来たら自動スクロールさせる 上記実装はどのように行なったのか教えて頂きたいです。。
int32_t

2021/10/28 08:18

> 上記実装はどのように行なったのか 私以外の知見も得られるように、新しい質問を作りましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問