У меня есть форма с двумя полями, и их значения заполняются программно. Я использую .trigger('change')
при изменении значения с помощью JS, а затем прослушивать это изменение с:Слушайте изменение на одном входе
$('body').on('change', $(myInput1), function() {});
и
$('body').on('change', $(myInput2), function() {});
Проблема заключается в том, что если я изменю myInput1
оба слушатели являются активными (как я изменил оба входа).
Вот небольшой демо, чтобы воспроизвести проблему:
$(document).ready(function() {
$('a').click(function() {
var randomValue = Math.random(0, 1) * 100;
var holder = $(this).closest('.holder');
holder.find('input').attr('value', randomValue);
holder.find('input').trigger('change');
});
$('body').on('change', $('input[name="field_one"]'), function() {
alert('field one has changed');
});
$('body').on('change', $('input[name="field_two"]'), function() {
alert('field two has changed');
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<form>
<div class="holder">
<a href="#" class="field1">Change me</a>
<input type="hidden" name="field_one" />
</div>
<div class="holder">
<a href="#">Change me</a>
<input type="hidden" name="field_two" />
</div>
</form>
@PraveenKumar извините? –
То, что вы сказали, правильно. Это безумие. Ваш код хорош. –
Если поля не являются динамическими, а затем присоединяют события к телу, фильтрация неэффективна. это означает, что jquery прослушивает для каждого события клика все, что находится под телом. Вы должны либо a) уменьшить область действия селектора (где вы используете тело), либо b) просто использовать сектор для элемента, который хотите присоединить событие клика (если они не являются динамическими) – Liam