执行javascript事件而不触发该事件处理程序

时间:2012-10-25 22:56:40

标签: javascript events event-handling

在我的最新代码中,我在textarea上有一个focus的事件处理程序。当用户单击textarea时,将触发该事件处理程序,该处理程序根据所选的textarea设置一些其他DOM状态。但是,在我的程序的其他地方,我想以编程方式设置textarea的focus而不触发该事件处理程序。例如,我知道Backbone可以silently执行某个操作。

我唯一的伪解决方案是临时设置一个变量:

var silence = true;

然后,在我的事件处理程序中,只有在静默为假时才执行逻辑。处理程序仍然被触发,但逻辑没有运行。

还有其他人知道更好的策略吗?

5 个答案:

答案 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函数,而不在实例化时触发它们。