在我的最新代码中,我在textarea上有一个focus
的事件处理程序。当用户单击textarea时,将触发该事件处理程序,该处理程序根据所选的textarea设置一些其他DOM状态。但是,在我的程序的其他地方,我想以编程方式设置textarea的focus
而不触发该事件处理程序。例如,我知道Backbone可以silently
执行某个操作。
我唯一的伪解决方案是临时设置一个变量:
var silence = true;
然后,在我的事件处理程序中,只有在静默为假时才执行逻辑。处理程序仍然被触发,但逻辑没有运行。
还有其他人知道更好的策略吗?
答案 0 :(得分:5)
您可以暂时unbind()
事件,如下所示:
您有以下场景来处理焦点事件:
function focus_handler() {
//focus handler code
...
...
}
$('#yourelement').bind('focus', focus_handler);
现在在代码中你想要以编程方式聚焦元素而不触发事件处理程序:
$('#yourelement').unbind('focus');
$('#yourelement').focus();
$('#yourelement').bind('focus', focus_handler);
答案 1 :(得分:3)
<input type="text" name="input" id="input" value="0">
<input type="text" name="input" id="input2" value="0">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
<script>
$(function() {
$('#input').focus(function(a,b) {
if (b) alert('forced');
});
$('#input').trigger('focus', jQuery.Event("focus"));
});
</script>
当存在事件处理程序的b
参数时,通过调用$('#input').trigger('focus', jQuery.Event("focus"));
来触发事件。因此,您可以根据正常焦点或强制焦点使处理程序功能执行。
答案 2 :(得分:3)
在jQuery中,trigger()
可以使用事件命名空间。只会触发与此命名空间绑定的事件和默认行为。
例如:
$('#yourelement').trigger('focus.anyOldNonsense');
应该做的伎俩(假如没有人使用“anyOldNonsense”作为事件名称空间)。
编辑:这适用于1.7.2和1.8.3,但在1.9以后有一个known bug用于向“焦点”事件添加数据和命名空间。
答案 3 :(得分:0)
由于您无法阻止事件发生,因此您需要某种中介来决定是否发出事件。因此,您可以让中间人监听所有焦点事件,并且您必须告诉该中间人是否重新发出该事件。然后你直接听那个中间人而不是dom节点。
答案 4 :(得分:0)
<a href='javscript:void()' onClick="()=>myFunction(myParams)">click here</a>
尝试使用params设置onClick函数,而不在实例化时触发它们。