仅在IE9中对angular指令中的所有字段触发jQuery更改事件
我有一个指令来控制搜索表单上的范围滑块。除IE9外,它的行为与预期一致。当我在IE9中更新一个字段时,它对该指令创建的所有字段调用.change()函数,即使这些字段已指定。这是该指令的缩写仅在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
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异常。不同的是,我需要在用户从字段中弹出标签时触发它,而不是在出现特定的单击事件时。