在IE9和10中,ng-model-onblur指令不会触发angularjs ng-change

时间:2014-08-11 21:46:27

标签: javascript angularjs internet-explorer angularjs-ng-change

我有一个带有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属性将值传输到输入文本框。

非常感谢任何帮助!

1 个答案:

答案 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?帮助我理解了问题并解决了问题。

再次感谢这个令人敬畏的社区!