2

I took this code from a tutorial and i don't understund how works js function to link the QuerySelector() with the element to select through Template Strings.

Here is the HTML:

<body>
  <div class="keys">
    <div data-key="65" class="key">
      <kbd>A</kbd>
      <span class="sound">clap</span>
    </div>
    <div data-key="83" class="key">
      <kbd>S</kbd>
      <span class="sound">hihat</span>
    </div>
    <div data-key="68" class="key">
      <kbd>D</kbd>
      <span class="sound">kick</span>
    </div>
    <div data-key="70" class="key">
      <kbd>F</kbd>
      <span class="sound">openhat</span>
    </div>
    <div data-key="71" class="key">
      <kbd>G</kbd>
      <span class="sound">boom</span>
    </div>
    <div data-key="72" class="key">
      <kbd>H</kbd>
      <span class="sound">ride</span>
    </div>
    <div data-key="74" class="key">
      <kbd>J</kbd>
      <span class="sound">snare</span>
    </div>
    <div data-key="75" class="key">
      <kbd>K</kbd>
      <span class="sound">tom</span>
    </div>
    <div data-key="76" class="key">
      <kbd>L</kbd>
      <span class="sound">tink</span>
    </div>
  </div>

  <audio data-key="65" src="sounds/clap.wav"></audio>
  <audio data-key="83" src="sounds/hihat.wav"></audio>
  <audio data-key="68" src="sounds/kick.wav"></audio>
  <audio data-key="70" src="sounds/openhat.wav"></audio>
  <audio data-key="71" src="sounds/boom.wav"></audio>
  <audio data-key="72" src="sounds/ride.wav"></audio>
  <audio data-key="74" src="sounds/snare.wav"></audio>
  <audio data-key="75" src="sounds/tom.wav"></audio>
  <audio data-key="76" src="sounds/tink.wav"></audio>

<script src="./script.js"></script>


</body>
</html>

And here is JS:

window.addEventListener('keydown', (e) => {
  const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
  const key = document.querySelector(`div[data-key="${e.keyCode}"]`);
    if (!audio) return; 
    audio.currentTime = 0;
    audio.play();
    key.classList.add('playing');
  });

Well, my doubt is about this part:
const audio = document.querySelector(audio[data-key="${e.keyCode}"]); const key = document.querySelector(div[data-key="${e.keyCode}"]);

How it works? Why he needed to put it inside Templete Strings?

Carlos Pérez
  • 167
  • 1
  • 10
  • because key code is dynamic ,and that code try to get element where data-key has value equal to key code of pressed key – Jatin Parmar May 03 '20 at 11:55

2 Answers2

3

Template strings are not necessary, they're just convenient.

Here is the same code without the template string:

  const audio = document.querySelector('audio[data-key="' + e.keyCode + '"]');

The template string here helps making the code clearer instead of using concatenation.

The goal of this code is to create a query like this 'audio[data-key="81"]' which will target audio element with a data-key attributes of "81"

Axnyff
  • 9,213
  • 4
  • 33
  • 37
1

Template strings are used to inject js code. For ex. In this part of your code

audio[data-key="${e.keyCode}"]

e.keyCode will be replaced by the keyCode in the event object. Let's say the key code is 53 then the code will become like this

audio[data-key="53"]

means the value of e.keyCode is injected in this piece of code audio[data-key="53"].