javascript - jQuery 复选框事件处理程序错误

标签 javascript jquery checkbox event-handling jquery-events

我最近发现了一个关于 jQuery 和复选框事件处理我似乎无法弄清楚的问题。

应该发生的是:

  • 单击与特定复选框关联的框图像。
  • 当 box-image 被标记为选中时(通过添加一类 .checked 来表示 并显示右上角的复选标记指示器)相关联的 还应选中复选框。

当我反复/快速点击灰色框图像图 block 时,您会看到有问题的错误。默认行为(切换选中的属性) 似乎是在事件处理程序触发后随机发生的。结果,这导致关联的选定框图像和复选框彼此随机不同步,从而提供不准确的数据。

请转到 https://jsfiddle.net/coreyds/5wLk2rge/4/ 查看此示例和实际错误

您是否有解决此问题的解决方案,无论是在 jQuery 还是纯 JavaScript 中?

这里是有问题的代码:

HTML:

<div class="container">
<div class="row">
    <div class="col-sm-6">
        <div class="form-group hwl-inline-checkbox-group">
            <label class="checkbox-inline">
                <div id="sa-checkbox-img1" class="sa-checkbox-img">
                    <i class="fa fa-check"></i>
                    <i class="fa fa-briefcase fa-3x"></i>
                    <label class="icon-img-label">WORK</label>
                </div>
                <input type="checkbox" id="imgCheck1" name="surrounding_area" class="sa-checkbox" value="work" />
            </label>

            <label class="checkbox-inline">
                <div id="sa-checkbox-img2" class="sa-checkbox-img">
                    <i class="fa fa-check"></i>
                    <i class="fa fa-building fa-3x"></i>
                    <label class="icon-img-label">SCHOOL</label>
                </div>
                <input type="checkbox" id="imgCheck2" name="surrounding_area" class="sa-checkbox" value="school" />
            </label>

            <label class="checkbox-inline">
                <div id="sa-checkbox-img3" class="sa-checkbox-img">
                    <i class="fa fa-check"></i>
                    <i class="fa fa-meh-o fa-3x"></i>
                    <label class="icon-img-label">NO PREFERENCE</label>
                </div>
                <input type="checkbox" id="imgCheck3" name="surrounding_area" class="sa-checkbox" value="no preference" />
            </label>
        </div>

    </div>
</div>
<!-- end .row -->

jQuery

$('.sa-checkbox-img').click(function(){
    var $this = $(this),
        sa_checkbox = $this.find($('.sa-checkbox'));

    if( !$this.hasClass('checked')){
        $this.addClass('checked');
        sa_checkbox.prop('checked', true);
    } else {
        $this.removeClass('checked');
        sa_checkbox.prop('checked', false);
    }
});

CSS

.container,
.row {
    margin-top: 20px;
}

h5 {
    text-align: center;
}

.sa-checkbox-img {
  color: #999;
  border: 5px solid #999;
  padding: 10px 25px;
  text-align: center;
  -moz-border-radius: 10px;
  -webkit-border-radius: 10px;
  border-radius: 10px;
  -moz-transition-duration: 250ms;
  -o-transition-duration: 250ms;
  -webkit-transition-duration: 250ms;
  transition-duration: 250ms;
  -moz-transition-property: all;
  -o-transition-property: all;
  -webkit-transition-property: all;
  transition-property: all;
}

.sa-checkbox-img label.icon-img-label {
  display: block;
}

.sa-checkbox-img i.fa.fa-check {
  display: none;
  color: white;
}

.sa-checkbox-img:hover {
  border-color: #009fd4;
  color: #009fd4;
  cursor: default;
}

.sa-checkbox-img.checked {
  border-color: #009fd4;
  color: #009fd4;
  cursor: default;
}

.sa-checkbox-img.checked i.fa.fa-check {
  display: block;
  background: #009fd4;
  position: absolute;
  top: -5px;
  right: -5px;
  color: white;
  padding: 5px;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  border-radius: 5px;
}

最佳答案

为了更好地绑定(bind)“label-input”对需要使用“for="someId"-id="someId"对。你的错误是在 .sa-checkbox-img 上检查 click你需要检查 时,阻止了内部标签在 .sa-checkbox 上单击。因为当您单击与复选框绑定(bind)的某个内部标签时,所有时间都会触发此复选框上的 click 事件,但是单击复选框不会触发标签上的 click

working example

祝你好运!

关于javascript - jQuery 复选框事件处理程序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32527305/

相关文章:

javascript - Nodejs http请求console.log函数打印两次

javascript - 根据单击的按钮将相同的表单发布到不同的操作

javascript - 正则表达式匹配 q'[Mike's bike]' 等引号

javascript - jQuery 选择多个相同的属性值

javascript - 理解箭头函数——为什么这个不起作用而这个起作用?

php - Jquery AJAX 发布到 PHP

javascript - 使用 jQuery 旋转背景图像

javascript - 从隐藏的复选框中获取值(value)

java - 如何在GWT中的一组下添加复选框?

javascript - jQuery 按钮来检查所有复选框问题