Knockout设置useOnlyNativeEvents为何未改变默认事件处理行为?
首先得明确ko.options.useOnlyNativeEvents = true的真实作用——它只是让Knockout在绑定自身声明的事件(比如你用data-bind="event:{...}"定义的事件)时,使用原生DOM事件API,而非依赖jQuery的事件系统。它完全管不了你手动通过jQuery绑定的事件,这是你代码里最容易混淆的点。
你的代码里的两个核心问题:
手动绑定的jQuery事件不受Knockout设置影响:你最后一行代码
$('#test').on('change',function() { alert("I was called"); });是直接用jQuery给元素绑定的change事件,这个操作和Knockout的useOnlyNativeEvents设置没有任何关联——不管你开不开这个选项,这个事件都会正常触发。所以你看到的两次弹窗(一次来自Knockout的ChangeEvt,一次来自这个手动绑定的事件)是完全正常的,和设置本身无关。你误解了
useOnlyNativeEvents的作用:这个选项不会改变事件触发的行为,只是改变Knockout绑定事件的底层实现逻辑。比如没开这个选项时,Knockout会用$(element).on(...)来绑定事件;开启后,它会改用原生的element.addEventListener(...)来绑定。但不管哪种方式,事件该触发还是会触发,从表面上看你不会看到明显的“行为改变”——除非你去调试查看Knockout绑定事件的底层代码,否则感知不到差异。
验证设置是否生效的小方法:
如果你想确认useOnlyNativeEvents是否真的起作用,可以做个简单测试:
- 删除你手动添加的
$('#test').on('change',...)代码,只保留Knockout的事件绑定。 - 打开浏览器开发者工具,查看
#test元素的事件监听器:- 如果设置生效,你会看到这个change事件是通过原生
EventListener绑定的; - 如果没生效,会显示是jQuery绑定的事件。
- 如果设置生效,你会看到这个change事件是通过原生
总结
你当前的Fiddle里,ko.options.useOnlyNativeEvents = true其实是生效的,但因为额外手动绑定了一个jQuery的change事件,导致你误以为设置没起作用。这个选项的作用是改变Knockout自身事件绑定的底层方式,而非阻止任何事件触发,也无法管控你手动绑定的jQuery事件。
内容的提问来源于stack exchange,提问作者Shekhar Pankaj

