这个问题类似于我之前的问题Click action on Focused DIV, 但这一次的主要话题是,当我点击其中一个div时,如何防止焦点事件触发。 上次我使用tabindex =' - 1'时有一个div可以让它专注于点击,现在我有一个tab的列表,tabindex> 0这样他们也可以在标签时获得焦点。
<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;});
上面代码的问题是焦点事件被触发,这意味着stopImmediatePropagation不能按照我预期的方式工作。两次单击操作可以对焦点事件行进行注释,但是当div获得时仍然需要双击专注于TAB。 以下是示例:http://jsfiddle.net/3MTQK/1/
答案 0 :(得分:79)
DEMO 此处
我认为你在这里缺少一些部分,
event.stopPropagation()
用于阻止事件冒泡。您可以阅读here。
event.stopImmediatePropagation()
除了保持元素上的任何其他处理程序不被执行外,此方法还通过隐式调用event.stopPropagation()
来停止冒泡。您可以阅读here
如果要停止浏览器事件,则应使用event.preventDefault()
。您可以阅读here
click = mousedown + mouseup
- &gt;当鼠标按下成功时,焦点将设置在HTML元素上。因此,不应绑定click
事件,而应使用'mousedown'。看我的演示。
您不能使用1个动作布尔值来确定单击了哪个div以及单击了多少次。检查我的演示,看看你如何处理它。
答案 1 :(得分:12)
要在点击div时简单地阻止触发焦点,请使用mousedown + event.preventDefault()
。使用mousedown而不是单击,因为正如@Selvakumar Arumugam所解释的那样,当mousedown成功并且event.preventDefault()将停止浏览器事件(包括我们的焦点)时会集中火力。
这是一个代码示例:
$('#div').on('mousedown', function(event) {
// do your magic
event.preventDefault();
});
答案 2 :(得分:0)
目前明显的答案是将您的选择器从简单的“div”限制为切换类名称系统,从而您可以控制焦点事件将触发的元素。它更繁琐,需要更多的异常编码,但可以完成这项工作。