Это действительно распространенная проблема , переменная field
, доступная для события focus
и blur
, относится к внешней области видимости, поэтому она содержит последнюю итерацию значение, в вашем случае оно будет содержать "password"
.
Есть много способов решить эту проблему, например, вы можете использовать $.each
, который вводит новую область действия:
jQuery.each(["email", "password"], function(index, fieldId) {
var field = $('#'+fieldId);
field.bind({
focus: function() {
field.css("border-color","#f00");
},
blur: function() {
field.css("border-color","#000");
}
});
});
Или с помощью $(this)
вместо field
в обработчиках событий, т. Е .:
var fields = ["email","password"];
for (var i = 0; i < fields.length; i++) {
$("#"+fields[i]).bind({
focus: function() {
$(this).css("border-color","#f00");
},
blur: function() {
$(this).css("border-color","#000");
}
});
}
Примечание не по теме: также в приведенном выше примере я использую обычный цикл вместо оператора for...in
, который на самом деле не предназначен для использования с объектами, подобными массиву.
Попробуйте два примера кода здесь .