【发布时间】:2014-10-04 20:27:28
【问题描述】:
我有一个带有 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从弹出窗口接收数据。当用户在字段外键入时,该指令调用 ng-change 函数,手动粘贴数据或通过右键单击文本框,但是当数据来自弹出窗口时,它不会触发该函数。
弹出窗口不使用AngularJS,而是使用窗口对象的opener属性将值传递给输入文本框。
任何帮助将不胜感激!
【问题讨论】:
-
从弹出窗口更新文本框中的值后,我使用 IE9 脚本控制台检查了范围变量的值。当文本框显示一个值时, angular.element(document.getElementById('name')).scope().name 产生“”。我签入了 Chrome 开发工具,并且在父级从弹出窗口接收到值时更新了范围值。
标签: javascript angularjs internet-explorer angularjs-ng-change