单击 div 时防止触发焦点事件

新手上路,请多包涵

这个问题和我之前的问题 Click action on Focused DIV 类似,但这次的主题是,如何防止当我点击其中一个 div 时触发焦点事件。上次我有一个带有 tabindex=‘-1’ 的 div 以使其在单击时可聚焦,现在我有一个带有 tabindex>0 的 div 列表,因此它们也可以在 tab 键时获得焦点。

 <div tabindex='1'>Div one</div>
<div tabindex='1'>Div two</div>
<div tabindex='1'>Div tree</div>
<div tabindex='1'>Div four</div>

一些造型:

 div {
    height: 20px;
    width: 60%;
    border: solid 1px blue;
    text-align: center;
}
div:focus {
    border: solid 2px red;
    outline: none;
}

现在,我使用标志(动作)在第二次单击 div 时触发动作(警报),如果它已经聚焦,则只需单击一次,例如使用 TAB。

 var action = false;
$('div')
    .click(function(e){
        e.stopImmediatePropagation();
        if(action){alert('action');}
        action = true;})
    .focus(function(){action = true;})
    .blur(function(){action = false;});

上面代码的问题是 focus 事件被触发,这意味着 stopImmediatePropagation 没有按我预期的方式工作。两次单击操作可以评论 focus 事件行,但是当 div 获得对 TAB 的关注时你仍然需要双击.这是示例:http: //jsfiddle.net/3MTQK/1/

原文由 olanod 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 994
2 个回答

演示 在这里

我认为你在这里遗漏了一些部分,

  1. event.stopPropagation() 用于阻止事件冒泡。你可以 在这里 阅读它。

  2. event.stopImmediatePropagation() 除了阻止执行元素上的任何其他处理程序之外,此方法还通过隐式调用 event.stopPropagation() 来停止冒泡。你可以 在这里 阅读

  3. 如果你想停止浏览器事件,那么你应该使用 event.preventDefault() 。你可以 在这里 阅读

  4. click = mousedown + mouseup -> 当鼠标按下成功时,焦点将设置在 HTML 元素上。因此,不应绑定 click 事件,而应使用“mousedown”。看我的演示。

  5. 您不能使用 1 个动作布尔值来确定单击了哪个 div 以及单击了多少次。检查我的演示,看看你如何处理它。

原文由 Selvakumar Arumugam 发布,翻译遵循 CC BY-SA 3.0 许可协议

要简单地防止在单击 div 时触发焦点,只需使用 mousedown + event.preventDefault() 。使用 mousedown 而不是 click 因为,正如 @Selvakumar Arumugam 解释的那样,焦点在 mousedown 成功时触发并且 event.preventDefault() 将停止浏览器事件(包括我们的焦点)。

这是一个代码示例:

 $('#div').on('mousedown', function(event) {
// do your magic
event.preventDefault();
});

原文由 justDoIT 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题