2017-11-27 2 views
0

クリックしたボタンに基づいてサウンド(モールスコード)を出力する仮想キーボードを作成しようとしています。Javascript - クリックしたボタンのIDに基づいてスイッチケースを作成する

下図のようにキーボードのレイアウトはHTMLボタンを使用して作成されました:

<button id="q">Q</button> 
<button id="w">W</button> 
<button id="e">E</button> 
<button id="r">R</button> 
<button id="t">T</button> 
<button id="y">Y</button> 

は、どのように私はクリックされたボタンのIDに基づいてオーディオを再生switch文を作成することができますか?この場合、文を切り替えるためのより良い選択肢がありますか?

これまでのところ私は、次のJSコードが出ているが、それは動作していないようです:事前に

document.getElementByTagName("button").onclick(){ 
    switch(){ 
     case "a": 
      a.play(); 
      document.getElementById("letter").innerHTML = "A"; 
      document.getElementById("morse").innerHTML = ".-"; 
      break; 
     case "b": 
      b.play(); 
      document.getElementById("letter").innerHTML = "B"; 
      document.getElementById("morse").innerHTML = "-..."; 
      break; 
    } 
} 

感謝!!完全なプロジェクトへ

リンク:https://github.com/Grexus/Personal-Projects/tree/master/Morse%20Code-er

+1

[ 'onclick'(https://www.w3schools.com/jsref/event_onclick.asp) – Olian04

+1

' document.getElementByTagName( "ボタン")のために厥無効構文 'べきdocument.getElementsByTagName( "button") '( 'getElements'を作成するための余分な' s'文字に注意してください)。参照:['document.getElementsByTagName()'](https:// developer.mozilla.org/ja-US/docs/Web/API/Document/getElementsByTagName');攻撃的であることを望むことなく、あなたの記憶をリフレッシュしたり、JavaScriptに精通したりする必要があります。 –

+0

違反はありません。まだ学習段階です。しかし、ポインタをありがとう。 – Matthew

答えて

2

ここにタイプミスdocument.getElementByTagNameがあり、それはdocument.getElementsByTagNameになります。 s

はまた、代わりに、スイッチケースのスイッチケースは、あなたもあなたのページにKeyDownイベントを聞くことができ、複雑

// using spread syntax to convert collection to array 
 
// forEach is an array method 
 
[...document.getElementsByTagName("button")].forEach(function(item) { 
 
    // adding eventListener to the elements 
 
    item.addEventListener('click', function() { 
 
    // calling the methods 
 
    // this.id will be the id of the clicked button 
 
    // there is a method in the object by same name, which will be trigger 
 
    obj[this.id](); 
 

 
    }) 
 
}) 
 

 
var obj = { 
 
    q: function() { 
 
    console.log('q') 
 
    }, 
 
    w: function() { 
 
    console.log('w') 
 
    }, 
 
    e: function() { 
 
    console.log('e') 
 
    }, 
 
    r: function() { 
 
    console.log('r') 
 
    }, 
 
    t: function() { 
 
    console.log('t') 
 
    }, 
 
    y: function() { 
 
    console.log('y') 
 
    } 
 
}
<button id="q">Q</button> 
 
<button id="w">W</button> 
 
<button id="e">E</button> 
 
<button id="r">R</button> 
 
<button id="t">T</button> 
 
<button id="y">Y</button>

0

だけの要素からIDを取得し、IDに切り替えるには: Array.prototype.slice.call(document.getElementsByTagName( "ボタン"))のforEach(要素。 = element.onclick = e => { switch(element.id){ // cases here } }; });

また、clickイベントを適切に適用するには、リストを配列に変換してからループ・スルーして、clickイベントを1つずつ適用する必要があります(jQueryとは異なります)。

しかし、このような何かのために、私はおそらく、様々な必要とするものを使用してオブジェクトを構築しますし、その後、ちょうどそれをリードバック:

const keys = { 
    a: { // id 
    tone: a, // element 
    letter: "A", 
    morse: ".-" 
    }, 
    // all the letters 
} 

次に、あなただけの作り、スイッチなしで正しい値を得ることができますそれがはるかにコンパクト:ここ

Array.prototype.slice.call(document.getElementsByTagName("button")).forEach(element => 
    element.onclick = e => { 
     const key = keys[element.id]; 
     key.tone.play(); 
     document.getElementById("letter").innerHTML = key.letter; 
     document.getElementById("morse").innerHTML = key.morse; 
    }; 
    }); 

が部分的例である:

const keys = { 
 
    a: { 
 
    tone: { play:() => console.log('play A') } 
 
    }, 
 
    b: { 
 
    tone: { play:() => console.log('play B') } 
 
    } 
 
}; 
 

 

 
Array.prototype.slice.call(document.getElementsByTagName("button")).forEach(element => { 
 
     element.onclick = e => { 
 
      const key = keys[element.id]; 
 
      key.tone.play(); 
 
     }; 
 
     });
<button id="a">A</button> 
 
<button id="b">B</button>
ここ

0

が代替ソリューションです....

function makeSound(id){ 
 
    switch(id){ 
 
     case "a": 
 
      a.play(); 
 
      document.getElementById("letter").innerHTML = "A"; 
 
      document.getElementById("morse").innerHTML = ".-"; 
 
      break; 
 
     case "b": 
 
      b.play(); 
 
      document.getElementById("letter").innerHTML = "B"; 
 
      document.getElementById("morse").innerHTML = "-..."; 
 
      break; 
 
     case "q": 
 
      //q.play(); 
 
      document.getElementById("letter").innerHTML = "q"; 
 
      document.getElementById("morse").innerHTML = "-..."; 
 
      break; 
 
     case "q": 
 
      //q.play(); 
 
      document.getElementById("letter").innerHTML = "q"; 
 
      document.getElementById("morse").innerHTML = "-..."; 
 
      break; 
 
     case "w": 
 
      //q.play(); 
 
      document.getElementById("letter").innerHTML = "w"; 
 
      document.getElementById("morse").innerHTML = "-..."; 
 
      break; 
 
     case "e": 
 
      //q.play(); 
 
      document.getElementById("letter").innerHTML = "e"; 
 
      document.getElementById("morse").innerHTML = "-..."; 
 
      break; 
 
    } 
 
}
<button id="q" onClick="makeSound(this.id)">Q</button> 
 
<button id="w" onClick="makeSound(this.id)">W</button> 
 
<button id="e" onClick="makeSound(this.id)">E</button> 
 
<button id="r" onClick="makeSound(this.id)">R</button> 
 
<button id="t" onClick="makeSound(this.id)">T</button> 
 
<button id="y" onClick="makeSound(this.id)">Y</button> 
 

 
<p id="letter"></p> 
 
<p id="morse"></p>

+0

上記をお寄せいただきありがとうございます!これは私が元々行っていたものです!私は「this」というキーワードをもっと習得する必要があるようです。しかし、 'forEach'メソッドを試してみるのが最善の解決策のようです。 – Matthew

1

をつり上げるために、オブジェクトのマッピングを使用することができ、その後、切り替えに注意してください結果 a、b、c、dなど。

document.addEventListener('keydown', (event) => { 
 
    const keyName = event.key; 
 
    console.log('keydown event\n\n' + 'key: ' + keyName); 
 
});

0

あなたはeventパラメータにtargetフィールドにアクセスすることにより、クリックされた要素のIDを取得することができます。

document.querySelectorAll('#container > *').forEach(v => { 
 
    v.onclick = function(event) { 
 
    console.log(event.target.id); 
 
    } 
 
});
<div id="container"> 
 
    <button id="q">Q</button> 
 
    <button id="w">W</button> 
 
    <button id="e">E</button> 
 
    <button id="r">R</button> 
 
    <button id="t">T</button> 
 
    <button id="y">Y</button> 
 
</div>

関連する問題