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

angularjs ng-change doesn't get fired on ng-model-onblur directive in IE9 and 10

本文关键字:指令 ng-model-onblur ng-change IE9 ie10 angularjs      更新时间:2023-09-26

我有一个带有ng-model-on-blur指令的输入文本框(从Angularjs: input[text] ngChange在值改变时触发),并附加了一个ng-change事件处理程序。它工作得很好,因为当用户键入开箱即用时,它会触发附加到ng-change的函数。我修改了link函数,这样它也可以绑定更改和粘贴事件。

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和ie10中,当从弹出框接收到数据时,ng-change不会被触发。当用户键入字段,手动粘贴数据或通过右键单击文本框时,该指令调用ng-change函数,但当数据来自弹出窗口时,它不会触发该函数。

该弹出窗口不使用AngularJS,而是使用window对象的opener属性将值传递给输入文本框。

任何帮助都将非常感激!

我能够解决这个问题,因为更改事件是从父页面元素的弹出页面触发的。设置opener. parentelelement .value = newValue后的弹出页面;正在执行parentelelement . fireevent ('change')。createEventObject为true,否则将对非ie浏览器执行parentelelement . dispatchevent()。

MS在IE9中引入了DOM Level 2事件,因此IE>=9浏览器不支持fireEvent。因为文档。对于IE>=9, createEventObject仍然为真,它正在执行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>= 9。为什么。fireevent()不能在IE9中工作?帮助我理解问题并解决它。

再次感谢这个很棒的社区!