1

我有一个带有 ng-model-on-blur 指令的输入文本框(从Angularjs 复制:input[text] ngChange 在值发生变化时触发),并附加了一个 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,而是使用 window 对象的 opener 属性将值传输到输入文本框。

任何帮助将不胜感激!

4

1 回答 1

1

由于从父页面元素的弹出页面触发更改事件的方式,我能够解决该问题。设置 opener.parentElement.value = newValue; 后的弹出页面 如果 document.createEventObject 为真,则执行 parentElement.fireEvent('change'),否则为非 IE 浏览器执行 parentElement.dispatchEvent()。

MS 在 IE9 中引入了 DOM Level 2 事件,因此在 IE >=9 浏览器中不支持 fireEvent。由于 IE>=9 的 document.createEventObject 仍然为 true,因此它正在执行 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 中不起作用?帮助我理解问题并解决它。

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

于 2014-08-20T06:25:46.453 回答