
いつもお世話になっております。
jQueryでシンセサイザーを作ろうとしています。
シンセサイザーの一般的な機能として、鍵盤を押したまま、他のスイッチやスライダーを操作して、発音中の音を変える事を実現したいのですが、うまくいきません。
問題を再現させるための最小限のコードは次のとおりです。
<input type="radio" name="t">
<input type="radio" name="t">
<div style="padding: 1em; border: 1px solid"></div>
<script src="jquery.min.js"></script>
<script>
const 鍵 = $('div')
鍵.on('touchstart', () => 鍵.css('background', '#000'))
鍵.on('touchend', () => 鍵.css('background', '#fff'))
</script>
このコードでは、鍵盤を<div>、音の変更スイッチをラジオボタンで作っています。
鍵盤をタッチすると、鍵盤の色が変わり、離すと元の色に戻ります。
しかし、鍵盤を押したままの状態でラジオボタンを押そうとしても反応しません。
鍵盤を押したままの状態で、ラジオボタンも操作できるようにするには、どうすれば良いかご教示ください。
No.1ベストアンサー
- 回答日時:
こんばんは
ご提示のスクリプトでは、
>鍵.on('touchstart' ~~~
のようにイベントを設定していますので、「鍵」(=div要素)で発生したイベントだけを取得します。
その状態で input要素にタッチしても(「鍵」ではないので)、当然ながら、ご提示の処理は実行されません。
input要素のイベントをとらえたければ、input要素にもイベント設定をする必要があります。
(タッチでなくchangeイベント等でも良いのかも)
一方で、対象要素が多い場合に、個々に設定していると面倒なので、documentにイベントを設定してまとめて取得し、イベント処理内で振り分けるという方法も考えられます。
前回も申し上げましたが、touchイベントは複数のタッチに対応していますので、まとめて設定するような場合には、changedTouches 属性などでタッチリストを取得して、それぞれに対して処理する必要があります。
https://developer.mozilla.org/ja/docs/Web/API/To …
お世話になっております。
スクリプトの最後に、
$('input').change(() => 鍵.css('background', '#777'))
を追加しました。
これで、ラジオボタンを押すと鍵が灰色になるようになりました。
しかし、「鍵」(=div要素)を押しながら、ラジオボタンを押そうとすると、ラジオボタンは反応しませんでした。
また、次のようにdocumentにイベントを設定するように変更してみました。
$(document).on('touchstart', e => {
if(e.target.matches('input')) 鍵.css('background', '#777')
else if(e.target.matches('div')) 鍵.css('background', '#000')
})
$(document).on('touchend', e => {
if(e.target.matches('div')) 鍵.css('background', '#fff')
})
これで、鍵を押しながらラジオボタンを押すと鍵が灰色になるようになりました。
しかし、ラジオボタンのチェックは変更されませんでした。
つまり鍵を押しながらラジオボタンを押すと、鍵は灰色に変わるのですが、なぜかラジオボタンの選択状態が変更されません。
ですからスクリプトで、選択されたラジオボタンをチェックするようにしました。
冗長な感じがして少し気持ち悪いですが、これで意図した通りの動きになりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
よろしくお願いします。
-
マウスオーバーでリンク先サム...
-
<a href="#" …>の意味を教えて...
-
bodyにidをつける理由は何ですか?
-
JavaScriptからVBScriptの呼び...
-
javascriptからウィンドウを開...
-
ボタンのID名を取得するには?
-
JavaScriptでiframeの内容を「...
-
ウインドウの後ろに隠れている...
-
html メールリンクにて自動ファ...
-
ハイパーリンクに下線を表示す...
-
テキストボックス内にハイパー...
-
JavaScriptが有効ならA、無効ならB
-
別ファイルのfunctionの読み込み方
-
htmlファイルを開いた時の画面...
-
¥マークの検索について
-
マウスクリックした地点のテキ...
-
UAによるリダイレクト
-
iframe内をリロードできますか?
-
スマホ上で、左右スワイプで次...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<div>のタッチ状態を維持したま...
-
プラグイン無しでContactform7...
-
Base64に変換したHTMLの<script...
-
jqeryのslicksliderのパスにつ...
-
jqueryのcolorboxを読込直後に...
-
Javascriptのエラーに悩まされ...
-
FC2 ブログで動作しない jQuery
-
colorboxの直接呼び出し方法に...
-
base64encodeでの文字化けについて
-
CKeditorについて
-
マウスオーバー+クリカブルマッ...
-
スライド写真で2、3枚目をラ...
-
マスターページでのJavaScriopt...
-
Photo Sliderの画像にリンクを...
-
javaスクリプトについて質問で...
-
nyroModal HEADタグ内の記述に...
-
ASP.NETでAjax通信する際について
-
lightbox2 表示の不具合
-
mootoolsとjQueryの共存がうま...
-
IEだけjsファイルを読み込まな...
おすすめ情報