定期的に div の表示を切り替える必要があるページがあります。問題は、親要素の 1 つに関連するクリック イベントが呼び出されないことが多いことです。表示切り替えを停止するか、速度を落とすと (たとえば、100 ミリ秒ではなく 300 ミリ秒)、クリック イベントが正常に発生します。
この問題を説明する短い例を作成しました。ここでテストできます: http://threeds.me/0xC0DE/
青/赤の四角形をクリックすると、理論上はクリック イベントが発生します。アニメーションがない場合 (ここではデフォルトの動作)、青い四角をクリックすると、常に onclick イベントが発生します。「再生/一時停止」をクリックすると、赤い四角の可視性が 100 ミリ秒ごとに切り替わり始めます。アニメーションの再生中、四角をクリックするたびにクリック イベントが呼び出されるわけではありません。
可視性を変更すると、何らかの形でDOMが台無しになり、その結果、イベントが数ミリ秒間停止すると思われます。ページへの影響を最小限に抑えるために css の表示プロパティを切り替えようとしましたが、結果は同じでした。
しかし、イベントだけではありません。コンテナ全体をタグにカプセル化すると、要素をクリックしてもブラウザで常に考慮されるとは限りません。したがって、子要素の可視性を変更すると、親が(かなり)しばらくの間盲目になるようです。これは本当に奇妙だと思います。
この問題は、Firefox、Chrome、および Opera (すべて mac 上でテストできない) と一致しているため、取得できないものがあることを意味します。ですから、解決策が得られなくても、何が問題なのかを理解したいと思います。
すぐに参照できるソースはこちら
<!DOCTYPE html>
<html>
<head><title>Wiggle problem</title>
<style>
#dback {
width: 200px;
height: 200px;
background-color: red;
}
#dfront {
width: 200px;
height: 200px;
background-color: blue;
}
</style>
<script type="text/javascript">
var run = false;
function playpause() {
if ( run ) {
run = false;
} else {
run = true;
update();
}
}
function update() {
if ( run==false ) {
return;
}
var el = document.getElementById('dfront');
if ( el.style.display != 'none' ) {
el.style.display = 'none';
}
else {
el.style.display = '';
}
setTimeout("update();", 100);
}
</script>
</head>
<body>
<a href="#" onclick="playpause();">play/pause</a>
<div id="container" onclick="d=new Date();t=d.getTime();document.getElementById('info').innerText='click '+t;">
<div id="dback">
<div id="dfront"></div>
</div>
</div>
<span id="info"></span>
</body>
</html>