jQuery $ el.trigger(’change’)不会触发本机侦听器
请考虑以下HTML:
o1 o2
和JavaScript(在文档准备就绪):
var $select = $('select'); var select = $select.get(0); function logger(msg) { return function () { console.log(msg); }; } $select.on('change', logger('jquery on select')); $(document).on('change', logger('jquery on document')); select.addEventListener('change', logger('native on select'), false); document.addEventListener('change', logger('native on document'), false); setTimeout(function () { console.log(' == programmatic =='); $select.trigger('change'); console.log(' == now try manual =='); }, 1000);
这导致控制台中的以下输出:
== programmatic == jquery on select jquery on document == now try manual == jquery on select native on select jquery on document native on document
问题是:为什么本地绑定的听众没有被调用? 怎么叫他们?
这里也是一个jsFiddle: http : //jsfiddle.net/PVJcf/
(使用jQuery 2.0.2)
本文对该主题进行了很好的概述:
触发事件处理程序
基本上, trigger
只会trigger
通过jQuery附加的事件处理程序或html中的某些事件处理程序属性。
您可以定义一个插件来触发本机浏览器事件,如下所示:
(function($) { $.fn.trigger2 = function(eventName) { return this.each(function() { var el = $(this).get(0); triggerNativeEvent(el, eventName); }); }; function triggerNativeEvent(el, eventName){ if (el.fireEvent) { // < IE9 (el.fireEvent('on' + eventName)); } else { var evt = document.createEvent('Events'); evt.initEvent(eventName, true, false); el.dispatchEvent(evt); } } }(jQuery)); // sample usage $('select').trigger2('change');
这不是完美的,但应该给你一般的想法。
这是使用此插件的小提琴更新。