如果您预料到这种相当不受欢迎的行为,那么解决它的方法是将一个额外的参数从 jQuery.trigger() 传递给复选框的单击处理程序。这个额外的参数是通知点击处理程序点击已经被编程触发,而不是用户直接点击复选框本身。然后复选框的单击处理程序可以反转报告的检查状态。
所以这就是我如何在 ID 为“myCheckBox”的复选框上触发点击事件。请注意,我还传递了一个带有单个成员 nonUI 的对象参数,该成员设置为 true:
$("#myCheckbox").trigger('click', {nonUI : true})
这是我在复选框的单击事件处理程序中处理它的方式。处理函数检查是否存在非 UI 对象作为其第二个参数。(第一个参数始终是事件本身。)如果参数存在并设置为 true,那么我会反转报告的 .checked 状态。如果没有传入这样的参数 - 如果用户只是单击 UI 中的复选框,则不会传入 - 然后我报告实际的 .checked 状态:
$("#myCheckbox").click(function(e, parameters) {
var nonUI = false;
try {
nonUI = parameters.nonUI;
} catch (e) {}
var checked = nonUI ? !this.checked : this.checked;
alert('Checked = ' + checked);
});
JSFiddle 版本位于http://jsfiddle.net/BrownieBoy/h5mDZ/
我已经用 Chrome、Firefox 和 IE 8 进行了测试。