清除:使用JavaScript在当前元素上激活伪类
我已经实现了自己的动态滚动组件,它通常工作得很好。我的问题是,页面中使用:active伪类的链接元素即使在用户滑动并滚动屏幕时也会保持其:active状态(这意味着鼠标不会生成“单击”) 目前我已经可以避免“点击”事件,但是视觉反馈(:active)与行为不匹配 所以我需要通过JavaScript直接或间接地清除“:active”。也许创建一个虚拟链接并通过JavaScript“激活”它可以解决这个问题,但我没有运气 为了找到解决方案,a制作了一个简单的测试用例,演示了以下内容: 有什么想法吗 注意,我只需要一个与Webkit一起工作的解决方案 更新 这个肮脏的黑客从元素清除:使用JavaScript在当前元素上激活伪类,javascript,css,webkit,css-selectors,qtwebkit,Javascript,Css,Webkit,Css Selectors,Qtwebkit,我已经实现了自己的动态滚动组件,它通常工作得很好。我的问题是,页面中使用:active伪类的链接元素即使在用户滑动并滚动屏幕时也会保持其:active状态(这意味着鼠标不会生成“单击”) 目前我已经可以避免“点击”事件,但是视觉反馈(:active)与行为不匹配 所以我需要通过JavaScript直接或间接地清除“:active”。也许创建一个虚拟链接并通过JavaScript“激活”它可以解决这个问题,但我没有运气 为了找到解决方案,a制作了一个简单的测试用例,演示了以下内容: 有什么想法吗
l1
中清除了:active伪类(基本上是从文档中简单地删除它):
问题是,
document.activeElement
显然没有引用刚按下鼠标的链接(它们没有那样获得焦点),所以我无法知道哪个元素当前处于活动状态。我不确定我是否完全理解您的意图,但是您可以使用document.querySelector
获取活动元素
将以下代码添加到测试用例对我来说很有用:
var aEl = document.querySelector("a:active"), // Active Element
nEl = aEl && aEl.nextSibling, // The node following it
pEl = aEl && aEl.parentNode; // The parent node
if (aEl && pEl) {
pEl.removeChild(aEl);
pEl.insertBefore(aEl, nEl);
}
工作演示:
既然您添加了标签,我假设您可以控制环境,不必担心遗留浏览器 问:我还没有测试过,但也许你可以用javascript创建一个mouseup事件,这样浏览器就认为按钮被释放了?@Mickey:不完全一样。我只需要清除“:active”,因此假设一次只能有一个“:active”元素,将另一个元素设置为active就足够了(但不知道如何操作)。@Lister先生:刚刚尝试过。这导致链接被“点击”,但它仍然处于“活动”状态,不幸的是。@FrankvanWijk没有那么快指出潜在的重复项,也没有帮助任何人,也许你应该花一点时间阅读这个问题,并意识到它实际上是一个非常不同的问题。太棒了!那很好用。我对removeChild/insertChild的黑客攻击并不满意,但至少这是可行的。您使用InsertAdjaceEntelement()而不是标准的insertBefore()有什么具体原因吗?@UdoG:只是有点大脑故障。我很快就改变了它(正如你在答案代码中看到的),但是忘记了。哦,好吧。:-)
var aEl = document.querySelector("a:active"), // Active Element
nEl = aEl && aEl.nextSibling, // The node following it
pEl = aEl && aEl.parentNode; // The parent node
if (aEl && pEl) {
pEl.removeChild(aEl);
pEl.insertBefore(aEl, nEl);
}