2015-12-16 4 views
2

У меня есть форма с двумя полями, и их значения заполняются программно. Я использую .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>

and jsfiddle demo

+0

@PraveenKumar извините? –

+1

То, что вы сказали, правильно. Это безумие. Ваш код хорош. –

+0

Если поля не являются динамическими, а затем присоединяют события к телу, фильтрация неэффективна. это означает, что jquery прослушивает для каждого события клика все, что находится под телом. Вы должны либо a) уменьшить область действия селектора (где вы используете тело), ​​либо b) просто использовать сектор для элемента, который хотите присоединить событие клика (если они не являются динамическими) – Liam

ответ

4

При использовании делегирования событий, то второй параметр on должен быть строкой, которая является селектор , В вашем случае вы передаете объект JQuery в качестве второго параметра, поэтому регистрация событий будет рассматривать его в качестве объекта данных и обработчик будет зарегистрирован в body элемент и объект JQuery будет передан в качестве event.data в обработчике

$(document).ready(function() { 
 
    $('a').click(function() { 
 
    var randomValue = Math.random(0, 1) * 100; 
 
    var holder = $(this).closest('.holder'); 
 
    holder.find('input').val(randomValue).change(); 
 
    //holder.find('input').attr('value', randomValue); 
 
    //holder.find('input').trigger('change'); 
 
    }); 
 

 
    $('body').on('change', 'input[name="field_one"]', function() { 
 
    snippet.log('field one has changed'); 
 
    }); 
 
    $('body').on('change', 'input[name="field_two"]', function() { 
 
    snippet.log('field two has changed'); 
 
    }); 
 

 

 
    $('body').on('change', $('input[name="field_one"]'), function(e) { 
 
    snippet.log('handler 1:' + this.tagName + ':' + e.data.selector); 
 
    }); 
 
    $('body').on('change', $('input[name="field_two"]'), function(e) { 
 
    snippet.log('handler 2:' + this.tagName + ':' + e.data.selector); 
 
    }); 
 
});
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> 
 
<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>

+0

Это имеет значение, I догадался, но был смущен, отвечать или нет. –

+0

Отлично, потрясающе. Оно работает. Лол. –

1

Попробуйте FIDDLE

не пропустите второй параметр как объект Jquery

Попробуйте изменить селектор из

$('body').on('change', $('input[name="field_one"]'), function(e) { 

в

$('body').on('change','input[name=field_one]', function(e) { 

Надеется, что это работает для вас.