【问题标题】:Prevent label active state using javascript使用 javascript 防止标签活动状态
【发布时间】:2023-03-16 22:16:01
【问题描述】:

我有一个相当 simple scenario,我试图阻止鼠标按下时的橙色背景:

document.querySelector('label').addEventListener('mousedown', (event) => {
  console.log('mouse down') 
  event.preventDefault();
})
label:active {
  background: orange;
}
<label>Press mouse down</label>

很遗憾,event.preventDefault() 无效,标签变为橙色。 (在 Chrome 和 Safari 和 IE11 中测试)

谁能解释一下这背后的原因,或者告诉我如何在没有黑客攻击的情况下以编程方式防止活动状态?

Codepen:https://codepen.io/anon/pen/pPZVrO

【问题讨论】:

  • 在 FF 中运行良好。
  • 哦,好吧,我会在这种情况下更新问题 - 谢谢@techLove
  • @Christoph 查看我的编辑/回滚评论 - console.log(event) 与 SO sn-p 的控制台输出结合使用会导致重大问题。
  • 哈哈,我们搞得一团糟;-)
  • @Santi 谢谢我把它加回来了:D

标签: javascript html css


【解决方案1】:

It seems like an old issue。如果需要,可以使用 pointer-events 属性修复它。此外,support 也相当不错(包括 IE11)

label:active {
  background: orange;
}

label {
  pointer-events: none;
}
<label>Press mouse down</label>

确保您在label 元素上声明了一些classid,这样您就不会针对所有这些。


JavaScript 解决方案 - 试一试

这个想法是在mousedown 上添加一个class 并用具有:activeclass 的CSS class 覆盖它,然后在mouseup 上删除class .. 类似

var overrideActive = function() {
  var labelElm = document.querySelector('label');
  var bodyElm = document.querySelector('body');

  function init() {
    //on mousedown, add a class and override it with css
    labelElm.addEventListener('mousedown', (event) => {
      event.target.className = 'disable-active';
    });

    //onmouseout get rid of the class
    bodyElm.addEventListener('mouseup', (event) => {
      labelElm.classList.remove('disable-active');
    });
  }

  return {
    init: init
  }
}();

overrideActive.init();
label:active {
  background: orange;
}

.disable-active:active {
  background-color: transparent;
}
<label>Press mouse down</label>

【讨论】:

  • 好吧,我不想在每种情况下都阻止它,这就是为什么我尝试使用 javascript 来做到这一点(就像在问题的标题中一样)
  • @jantimon 使用 mousedowne.preventDefault() 无论如何都会阻止它。
  • 我不明白你想说什么 - 在真正的应用程序中我会添加一个if ;)
  • 真正的问题是它完全忽略了指针事件的元素。这会导致:a)UI 的行为发生变化,因为下面的元素突然收到事件 b)您根本不会在 javascript 中收到该元素的事件。这与接收事件然后决定阻止默认操作不同。
  • @jantimon 我想我也可以试试别的,给我一些时间:)
【解决方案2】:

您可以通过 css 禁用鼠标事件。添加此 CSS 将防止背景变为橙色。

label {
  pointer-events: none;
}

如果您不想在每种情况下都这样做,请使用一个类并仅在需要时应用 noclick 类(即,作为 react 的 render() 方法的一部分,或者在生成页面时,取决于您正在使用的框架。

.noclick {
  pointer-events: none;
}

【讨论】:

  • 为什么要添加重复的答案,然后甚至使用糟糕的格式?
  • @Christoph - 区别在于管理状态。我不知道你的底层技术堆栈是什么,但是如果在单向数据流范式(例如 react/redux)中,通常会避免绑定到 DOM 事件并直接操作 DOM
  • 我不知道你的反应与我在评论中试图说的话有什么关系... :-)
猜你喜欢
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2013-05-08
  • 2019-10-22
  • 1970-01-01
相关资源
最近更新 更多