最近、私は今後のインターンシップに多大な貢献をしています。私が見する同社は、さまざまなリソースをお勧めしますが、私の友人にもこのサイトを示唆した:CSSクラスを正常に削除していないバグENDYENDイベント
私はそれを試してみることにしましたし、JavaScriptのドラムキットだった最初のプロジェクトで昨日始めました。
全体的なプロジェクトは難しくありませんでしたが、起こっていた小さなバグに気付きました。そのため、このプロジェクトでは、いずれかのASDFGHJKJLが押されたときに起動するいくつかの異なるHTML要素に「keydown」イベントリスナーを関連付けます。リスナーは、サウンドを再生するだけでなく、押されているキーに少しの効果を加えるクラスを要素に付け加えます。
クラスを削除するには、要素にトランジェントリスナーを追加しました。したがって、キーを押した後にCSSプロパティがトランジションを終了すると、クラスは削除され、ブラウザのグラフィックスは通常の状態に戻ります。
これで、キーをゆっくりと押すと、完全に正常に動作します。しかし、私が気づいたのは、1〜2秒間キーを押し続けると、追加されるクラスが決して削除されず、グラフィックが永久的であるように見えるということです。私はその後、コンソールをチェックし、移行イベントが一度それのように立ち往生したら、決して起動しないことに気づいた。
ここに完成したファイルのコードを示します。
function removeTransition(e)
{
if (e.propertyName !== 'transform')
return;
e.target.classList.remove('playing');
}
function playSound(e)
{
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
const key = document.querySelector(`div[data-key="${e.keyCode}"]`);
if (!audio)
return;
key.classList.add('playing');
audio.currentTime = 0;
audio.play();
}
そして、これは、それはdoesnのように、だから我々はremoveTransition機能であればループに入れて、我々はtransitionendリスナーを添付する方法、これはそれで
const keys = Array.from(document.querySelectorAll('.key'));
keys.forEach(key => key.addEventListener('transitionend', removeTransition));
を行うには何を持っているかどうかわからないです移行している各プロパティのクラスを削除しないでくださいが、ifループを削除するとページが完全に機能することに気付きました。
私はtransitionendイベントで何が起こっているのか、なぜそれがちょうどそのようになったら完全に終了するのをなぜ止めているのか完全にはわかりません。また、ifループが削除されたときに、なぜ動作するのでしょうか。おそらく、クラスがすべてのプロパティをループするときにクラスを削除する可能性がさらに高いでしょうか?全く分からない。誰がここで何が起こっているのか知っているのだろうかと疑問に思いました。
EDIT:
私が試してみて、これの一番下に到達するためにplaySound関数を少し変更しました。
function playSound(e)
{
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
if(!audio)
{
return;
}
if(key.classList.contains("playing"))
{
console.log("True");
key.classList.remove("playing");
}
audio.currentTime = 0;
audio.play();
console.log("adding");
key.classList.add("playing");
}
私は、要素がすでに「再生」クラスを含むかどうかをチェックするifステートメントを追加しました。私はclassList.removeコールを追加して、同じブランチでそれを取り除きました。私が見つけたのは、いったん立ち往生し、再びキーを押すと、if文に分岐してコンソールメッセージを表示しますが、「再生」クラスは削除されません。
せずに別の解決策あなたはMCVEであなたの問題を再現することはできますか?私はあなたのコードのいくつかを取って、それをフィドルに入れましたが、それは正常に動作しているようです。 – Terry
https://codepen.io/anon/pen/PmazjN どのブラウザをお使いですか?私はChromeを使用しています。それが可能かどうかは分かりませんが、私は聞きたいと思っていました。 javascriptとCSSを含むHTMLをコピーしました。私はあなたのためにファイルを持っていないので、すべての音質をコメントアウトしました。私はまだそれを複製することができました。 – Pilpod