我试图找到鼠标指针下的新渲染元素。 (*)
这是我的代码:
btn.addEventListener('click', function () {
btn.remove();
for (let i = 0; i < 10; i++) {
lst.appendChild(document.createElement('li')).textContent = 'Element ' + i;
}
requestAnimationFrame(function () { requestAnimationFrame(function () {
const chosen = document.querySelector('li:hover');
alert(chosen && 'Your mouse on ' + chosen.textContent); // do something more with chosen
}); });
});
#btn { width: 200px; height: 200px; }
#lst { width: 200px; line-height: 20px; display: block; padding: 0; }
#lst li { display: block; height: 20px; width: 200px; overflow: hidden; }
#lst li:hover { background: #ccc; }
<button id=btn>Click Me</button>
<ul id=lst><ul>
我很困惑,需要使用两个requestAnimationFrame
才能使我的代码正确执行。删除其中一个raf,警报将显示null
。
这段代码对我来说似乎很丑陋。如何更优雅地实现它?
如果有人关心:我在Firefox上运行我的代码。而且,作为我的Firefox扩展的一部分,该代码只需针对Firefox 60+进行目标定位。
(*): 故事背后可能更加复杂。但为了简单起见...
:hover
,当我用鼠标点击时,它确实移动了。所以对我来说更好的测试用例是将所有内容都包装在一个超时中,这样我就可以停止触摸鼠标:https://jsfiddle.net/1ky05m46/ 如果我们将.remove()
更改为设置display:none
规则,那么我们可以看到按钮仍然是具有:hover
的按钮... https://jsfiddle.net/1ky05m46/1/ 我想这是不可能的...请注意,在这种情况下,Chrome甚至直到鼠标移动才会更新它... - Kaiido