我有一个带有ng-model-on-blur指令的输入文本框(从Angularjs: input[text] ngChange fires while the value is changing复制),并附加了ng-change事件处理程序。它工作得很好,就像当用户开箱即用时,它会激活附加到ng-change的功能。我修改了链接功能,因此它也会对更改和粘贴事件进行绑定。
link: function(scope, elm, attr, ngModelCtrl) {
if (attr.type === 'radio' || attr.type === 'checkbox') return;
if($sniffer.hasEvent('input')){
elm.unbind('input').unbind('keydown').unbind('change').unbind('paste');
}
else if($sniffer.hasEvent('change')){
elm.unbind('input').unbind('keydown').unbind('change').unbind('paste');
}
//IE8 doesn't recognize the input or change events and throws error on unbind input.
else{
elm.unbind('keydown').unbind('change').unbind('paste');
}
elm.bind('blur change paste', function() {
scope.$apply(function() {
ngModelCtrl.$setViewValue(elm.val());
});
});
}
我在该页面上有一个按钮,打开一个弹出页面,用户可以从该页面输入内容,然后将值传回父页面上的输入文本框。在大多数其他浏览器(Chrome,Firefox,Safari,甚至是IE8 ..)中,当从弹出窗口向输入文本框接收数据时会触发ng-change,但在IE9中并且10 ng-change isn&t; t从弹出窗口收到数据时触发。当用户输入字段时,该指令调用ng-change函数,手动粘贴数据或通过右键单击文本框,但是当数据来自弹出窗口时,它不会触发该函数。
弹出窗口不使用AngularJS,而是使用window对象的opener属性将值传输到输入文本框。
非常感谢任何帮助!
答案 0 :(得分:1)
由于从父页面元素的弹出页面触发更改事件的方式,我能够解决该问题。设置opener.parentElement.value = newValue后的弹出页面;如果document.createEventObject为true,则执行parentElement.fireEvent('change'),否则它正在为非IE浏览器执行parentElement.dispatchEvent()。
MS使用IE9引入了DOM Level 2事件,因此IE> = 9浏览器不支持fireEvent。由于document.createEventObject对于IE> = 9仍然是正确的,因此它正在执行fireEvent,因此在我的指令中,elm.bind('change')没有被触发。我将弹出的javascript文件更改为:
if(element.dispatchEvent) {
//IE >= 9 and other browsers event code
var evt = document.createEvent("HTMLEvents");
evt.initEvent(event, true, true );
return element.dispatchEvent(evt);
}
else if(element.fireEvent){
//IE < 9
var evt = document.createEventObject();
return element.fireEvent('on'+event,evt);
}
和ng-change也开始触发IE&gt; = 9。这篇文章Why does .fireEvent() not work in IE9?帮助我理解了问题并解决了问题。
再次感谢这个令人敬畏的社区!