8

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

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

var silence = true;

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

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

4

5 回答 5

5

你可以暂时unbind()的事件,像这样:

您有以下处理焦点事件的场景:

function focus_handler() {
   //focus handler code
   ...
   ...
}

$('#yourelement').bind('focus', focus_handler);

现在在您希望以编程方式聚焦元素而不触发事件处理程序的代码部分:

$('#yourelement').unbind('focus');
$('#yourelement').focus();
$('#yourelement').bind('focus', focus_handler);
于 2012-10-25T23:33:26.633 回答
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"));。所以你可以让你的处理函数根据正常焦点或强制焦点执行。

于 2012-10-25T23:38:51.790 回答
3

在 jQuery 中,trigger()可以采用事件命名空间。只有与此命名空间绑定的事件和默认行为才会被触发。

例如:

$('#yourelement').trigger('focus.anyOldNonsense');

应该可以解决问题(前提是没有人使用“anyOldNonsense”作为事件命名空间)。

编辑:这适用于 1.7.2 和 1.8.3,但在 1.9 及更高版本中存在一个已知错误,用于将数据和命名空间添加到“焦点”事件。

于 2013-09-12T12:16:02.710 回答
0

由于您无法阻止事件的发生,因此您需要某种中介来决定是否发出事件。因此,您将让中介监听所有焦点事件,并且您必须告诉该中介是否重新发出该事件。然后你会直接听那个中介而不是 dom 节点。

于 2016-10-29T22:57:09.677 回答
-1
<a href='javscript:void()' onClick="()=>myFunction(myParams)">click here</a>

试试这个 hack 来设置带有参数的 onClick 函数,而不是在实例化时触发它们。

于 2016-12-01T08:55:45.160 回答