Вы можете воспользоваться свойствами defaultValue
и defaultSelected
полей формы.Сначала найдите все входные данные, чье значение defaultValue
отличается от его value
:
var changedFields = $("input[id*=mid]").filter(function () {
return this.defaultValue != this.value;
});
Затем найдите все поля списка, чье значение defaultSelected
отличается от текущего выбора:
changedFields.add($("select[id*=mse_]").filter(function () {
return !this.options[this.selectedIndex].defaultSelected;
}));
Обратите внимание, что если <option>
не имеет атрибута selected
, для всех опций defaultSelected
будет иметь значение false.Один из способов решить эту проблему - найти вариант по умолчанию.Опция по умолчанию будет последней опцией, для которой defaultSelected
имеет значение true, и если ни одна из них не делает, тогда опцией по умолчанию будет первая опция.
changedFields.add($("select[id*=mse_]").filter(function () {
var defaultOption = $("option", this).filter(function () {
return this.defaultSelected;
});
defaultOption = defaultOption.length ? defaultOption.last()[0] : this.options[0];
return this.options[this.selectedIndex] != defaultOption;
}));
Затем найдите родительские строки:
var changedRows = changedFields.closest("tr");
Затем получите массив индексов строк из строк, используя .map()
:
var changedRowIndexes = changedRows.map(function () {
return $(this).index();
}).get();
Теперь changedRowIndexes
- это массив чисел, указывающих индекс каждой строки со входомизмененный элемент.
После того, как вы отправили изменения на сервер, неплохо было бы обновить defaultValue
ваших входных данных:
changedFields.filter("input").each(function () {
this.defaultValue = this.value;
});
changedFields.filter("select").each(function () {
$("option", this).each(function () {
this.defaultSelected = false;
});
this.options[this.selectedIndex].defaultSelected = true;
});