仅在IE9中对angular指令中的所有字段触发jQuery更改事件

仅在IE9中对angular指令中的所有字段触发jQuery更改事件,jquery,angularjs,internet-explorer-9,Jquery,Angularjs,Internet Explorer 9,我有一个指令来控制搜索表单上的范围滑块。除IE9外,它的行为与预期一致。当我在IE9中更新一个字段时,它对该指令创建的所有字段调用.change()函数,即使这些字段已指定。这是该指令的缩写 MyFactory.directive('rangeSlider', [ '$log', '$filter', function( $log, $filter ) { var sliderTemplate = "<div>" + "<div id='{{rangeD

我有一个指令来控制搜索表单上的范围滑块。除IE9外,它的行为与预期一致。当我在IE9中更新一个字段时,它对该指令创建的所有字段调用.change()函数,即使这些字段已指定。这是该指令的缩写

MyFactory.directive('rangeSlider', [ '$log', '$filter', function( $log, $filter ) {
    var sliderTemplate = "<div>" +
        "<div id='{{rangeData.slider}}'></div>" +
        "<input id='{{rangeData.lowerId}}' type='text' placeholder='No Min' class='text-center'>" +
        "<input id='{{rangeData.upperId}}' type='text' placeholder='No Max' class='text-center right'>" +
        "<div class='middle-marker'>to</div>" +
        "</div>";
    return {
        restrict: 'A',
        replace: true,
        template: sliderTemplate,
        scope: {
            saveRangeData: '&',
            values: '='
        },
        link: function ( scope, element, attrs ) {
            var initialLowerValue, initialUpperValue;

            scope.rangeData = [];

            if (attrs.step) {
                scope.rangeData.step = parseFloat(attrs.step);
            } else {
                scope.rangeData.step = 1;
            }

            scope.rangeData.slider = attrs.slider;
            scope.rangeData.lowerId = attrs.lowerId;
            scope.rangeData.lowerRange = parseInt(attrs.lowerRange, 10) - scope.rangeData.step;
            scope.rangeData.upperId = attrs.upperId;
            scope.rangeData.upperRange = parseInt(attrs.upperRange, 10) + scope.rangeData.step;
            scope.rangeData.modelName = attrs.modelName;
            scope.rangeData.initialValues = scope.values;

            if ( (scope.rangeData.initialValues) && (scope.rangeData.initialValues[0]) != null ) {
                initialLowerValue = scope.rangeData.initialValues[0];
            } else {
                initialLowerValue = scope.rangeData.lowerRange;
            }

            if ( (scope.rangeData.initialValues) && (scope.rangeData.initialValues[1]) != null ) {
                initialUpperValue = scope.rangeData.initialValues[1];
            } else {
                initialUpperValue = scope.rangeData.upperRange;
            }

            function updateFields( ui ) {
                if( ui.values[ 0 ] > ui.values[ 1 ] ) {
                    return false;
                }

                // Sentinel value check, lower
                // Additional check prevents max upperRange value from being set if the user puts in a value out of range.
                if ( ui.values[ 0 ] === scope.rangeData.lowerRange || ui.values[ 0 ] === scope.rangeData.upperRange ) {
                    $( "#" + scope.rangeData.lowerId ).val('');
                    scope.rangeData.lowerVal = null;
                } else {
                    $( "#" + scope.rangeData.lowerId ).val( ui.values[ 0 ] );
                    scope.rangeData.lowerVal = ui.values[ 0 ];
                }

                // Sentinel value check, upper
                if ( ui.values[ 1 ] === scope.rangeData.upperRange ) {
                    $( "#" + scope.rangeData.upperId ).val('');
                    scope.rangeData.upperVal = null;
                } else {
                    $( "#" + scope.rangeData.upperId ).val( ui.values[ 1 ] );
                    scope.rangeData.upperVal = ui.values[ 1 ];
                }

                scope.saveRangeData({ rangeData: scope.rangeData });

            }

            scope.$watch( element, function(){
                $( "#" + scope.rangeData.slider ).slider({
                    step: scope.rangeData.step,
                    range: true,
                    min: Number( scope.rangeData.lowerRange ),
                    max: Number( scope.rangeData.upperRange ),
                    values: [ Number( initialLowerValue ), Number( initialUpperValue ) ],
                    slide: function( event, ui ) {
                        updateFields(ui);
                    },
                    change: function( event, ui ) {
                        updateFields(ui);
                    }
                });

                // Ensures value of slider reflects against input fields initially
                $( "#" + scope.rangeData.lowerId ).val( $( "#" + scope.rangeData.slider ).slider( "values", 0 ) );

                // Ensures placeholder functionality
                if ( initialLowerValue === scope.rangeData.lowerRange ) {
                    $( "#" + scope.rangeData.lowerId ).val('');
                }

                $( "#" + scope.rangeData.upperId ).val( $( "#" + scope.rangeData.slider ).slider( "values", 1 ) );

                // Ensures placeholder functionality
                if (initialUpperValue === scope.rangeData.upperRange) {
                    $( "#" + scope.rangeData.upperId ).val('');
                }

                // Ensures changes to input fields reflects against slider.
                $( "#" + scope.rangeData.lowerId ).change( function(){
                    var ui = { values: [] };
                    $( "#" + scope.rangeData.slider ).slider( "values", 0, unformatValue( $( "#" + scope.rangeData.lowerId ).val() ) );
                    ui.values = $( "#" + scope.rangeData.slider ).slider( "values" );
                    updateFields( ui );
                });

                $( "#" + scope.rangeData.upperId ).change( function(){
                    var ui = { values: [] };
                    $( "#" + scope.rangeData.slider ).slider( "values", 1, unformatValue( $( "#" + scope.rangeData.upperId ).val() ) );
                    ui.values = $( "#" + scope.rangeData.slider ).slider( "values" );
                    updateFields( ui );
                });

            });

        }
    };
}]);
MyFactory.directive('RangeSlaider',['$log','$filter',函数($log,$filter){
var sliderTemplate=“”+
"" +
"" +
"" +
“到”+
"";
返回{
限制:“A”,
替换:正确,
模板:sliderTemplate,
范围:{
saveRangeData:“&”,
值:'='
},
链接:函数(范围、元素、属性){
变量initialLowerValue,initialUpperValue;
scope.rangeData=[];
如果(属性步骤){
scope.rangeData.step=parseFloat(attrs.step);
}否则{
scope.rangeData.step=1;
}
scope.rangeData.slider=attrs.slider;
scope.rangeData.lowerId=attrs.lowerId;
scope.rangeData.lowerRange=parseInt(attrs.lowerRange,10)-scope.rangeData.step;
scope.rangeData.upperId=attrs.upperId;
scope.rangeData.upperRange=parseInt(attrs.upperRange,10)+scope.rangeData.step;
scope.rangeData.modelName=attrs.modelName;
scope.rangeData.initialValues=scope.values;
if((scope.rangeData.initialValues)和&(scope.rangeData.initialValues[0])!=null){
initialLowerValue=scope.rangeData.initialValues[0];
}否则{
initialLowerValue=scope.rangeData.lowerRange;
}
if((scope.rangeData.initialValues)&&(scope.rangeData.initialValues[1])!=null){
initialUpperValue=scope.rangeData.initialValues[1];
}否则{
initialUpperValue=scope.rangeData.upperRange;
}
函数更新字段(ui){
if(ui.values[0]>ui.values[1]){
返回false;
}
//哨兵值检查,降低
//如果用户输入的值超出范围,则附加检查可防止设置最大上限值。
if(ui.values[0]==scope.rangeData.lowerRange | | ui.values[0]==scope.rangeData.upperRange){
$(“#”+scope.rangeData.lowerId.val(“”);
scope.rangeData.lowerVal=null;
}否则{
$(“#”+scope.rangeData.lowerId).val(ui.values[0]);
scope.rangeData.lowerVal=ui.values[0];
}
//哨兵值检查,上限
if(ui.values[1]==scope.rangeData.upperRange){
$(“#”+scope.rangeData.upperId).val(“”);
scope.rangeData.upperVal=null;
}否则{
$(“#”+scope.rangeData.upperId).val(ui.values[1]);
scope.rangeData.upperVal=ui.values[1];
}
saveRangeData({rangeData:scope.rangeData});
}
范围$watch(元素,函数(){
$(“#”+scope.rangeData.slider).slider({
步骤:scope.rangeData.step,
范围:对,
最小值:编号(scope.rangeData.lowerRange),
最大值:数字(scope.rangeData.upperRange),
值:[Number(initialLowerValue),Number(initialUpperValue)],
幻灯片:功能(事件、用户界面){
更新字段(ui);
},
更改:功能(事件、用户界面){
更新字段(ui);
}
});
//确保滑块的值最初反映在输入字段上
$(“#”+scope.rangeData.lowerId).val($(“#”+scope.rangeData.slider).slider(“值”,0));
//确保占位符功能
if(initialLowerValue===scope.rangeData.lowerRange){
$(“#”+scope.rangeData.lowerId.val(“”);
}
$(“#”+scope.rangeData.upperId).val($(“#”+scope.rangeData.slider).slider(“值”,1));
//确保占位符功能
if(initialUpperValue==scope.rangeData.upperRange){
$(“#”+scope.rangeData.upperId).val(“”);
}
//确保对输入字段的更改反映在滑块上。
$(“#”+scope.rangeData.lowerId).change(函数(){
var ui={values:[]};
$(“#”+scope.rangeData.slider).slider(“值”,0,未格式化值($(“#”+scope.rangeData.lowerId).val());
ui.values=$(“#”+scope.rangeData.slider).slider(“值”);
更新字段(ui);
});
$(“#”+scope.rangeData.upperId).change(函数(){
var ui={values:[]};
$(“#”+scope.rangeData.slider).slider(“值”,1,未格式化值($(“#”+scope.rangeData.upperId).val());
ui.values=$(“#”+scope.rangeData.slider).slider(“值”);
更新字段(ui);
});
});
}
};
}]);

非常感谢您的意见。

我以前也解决过类似的问题。尝试IE中的
单击
事件,为其他人更改


不知道为什么它对我有效,我只是把它记为另一个IE异常。

不同的是,我需要在用户从字段中弹出标签时触发它,而不是在出现特定的单击事件时。