使用 backbone.js,检测单选按钮事件并显示或隐藏 div

Using backbone.js, detect radio button event and show or hide divs

我正在使用 backbone 视图来捕获用户在两个单选按钮之间进行选择的时间。

单选按钮如下所示:

Do you have a spouse?
[ ] Yes
[ ] No   

和 HTML:

<span>Do you have a spouse?</span>
<input type="radio" name="hasSpouse" value="yes">Yes
<br/>
<input type="radio" name="hasSpouse" value="no">No

<div class="hasSpouseYes" style="display:none;">Awesome!</div>
<div class="hasSpouseNo"  style="display:none;">That's too bad</div>

显示或隐藏两个 div 取决于用户是单击 'yes' 还是 'no' 单选按钮。

所以我把这是视图的事件部分:

'click input[name=hasSpouse]:checked': 'hasSpouseEvent',

这里是应该负责隐藏和显示各种 div 部分的函数。

 hasSpouseEvent: function () {
        var val = $('input[name=hasSpouse]:checked').val();
        if (val === 'yes') {
            this.$('.hasSpouseYes').show();
            this.$('.hasSpouseNo').hide();
        } else {
            this.$('.hasSpouseYes').hide();
            this.$('.hasSpouseNo').show();
        }
 }

第一次使用,效果很好。但是在对其进行测试并单击 'yes' 和 'no' 单选按钮之后,它似乎开始随机显示和隐藏 div.

单击单选按钮时选中它。 您用来绑定事件和访问值的选择器是 'input[name=hasSpouse]:checked'

从某种意义上说,单选按钮被点击后变成选中状态。所以你的选择器不应该匹配。但是 backbone 将事件处理程序委托给视图元素。所以我想当事件传播到视图元素时,无线电被标记为选中并匹配选择器,因此触发附加的处理程序。

另一个想法是我们可以选择在事件处理程序中使用 event.preventDefault() 来防止默认行为。因此,理想情况下,默认行为应该在执行所有处理程序之后发生。同样在这种情况下,事件没有直接附加到元素。

由于实现方式的原因,您可能会在某些浏览器中遇到错误行为。

为了安全起见,最好使用选择器 input[name="hasSpouse"] 并从事件对象访问被点击的元素,如下所示:

var View = Backbone.View.extend({
   el: '#form',
   events: {
     'click input[name="hasSpouse"]': 'hasSpouseEvent',
   },
   hasSpouseEvent: function(event) {
     $this = $(event.target);
     this.$('.hasSpouseYes')[$this.val() == 'yes' ? 'show' : 'hide']();
     this.$('.hasSpouseNo')[$this.val() == 'no' ? 'show' : 'hide']();
   }
 });

 var view = new View();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/underscore.js/1.1.4/underscore-min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/backbone.js/0.3.3/backbone-min.js"></script>
<div id="form"> <span>Do you have a spouse?</span>

  <input type="radio" name="hasSpouse" value="yes">Yes
  <br/>
  <input type="radio" name="hasSpouse" value="no">No
  <div class="hasSpouseYes" style="display:none;">Awesome!</div>
  <div class="hasSpouseNo" style="display:none;">That's too bad</div>
</div>