如何将复选框绑定到已经存在的复选框?

时间:2018-07-14 21:24:04

标签: javascript jquery asp.net-mvc

我的网站上有一个Product attribute Checkbox,它将使用ajax和javascript onchange事件更新产品列表。

我在Here (jsfiddle)上添加了所有代码。

HTML

<input data-option-ids="1358" id="specification-input-21-1358" type="checkbox">
<label class="filter-item-name" for="specification-input-21-1358">Only Available Product</label>

JavaScript

$('#specification-input-21-1358').change(function() {
    //ajax
});

我无法修改此代码,因为它是模块的一部分,该模块可用于我的所有属性checkboxes,并且是动态创建的并且可以正常工作。

我在页面顶部添加了一个具有不同样式的另一个复选框,我希望它与该复选框一样。我的目的是让客户不要错过可以使用此复选框的功能。(第一个复选框是属性过滤器的一部分)

第二个复选框HTML:

<div class="availButton">
    <p dir="rtl" style="text-align: left;">show only available products:</p>
    <div class="slideThree">
        <input id="slideThree" name="check" type="checkbox">
        <label for="slideThree">
        </label>
    </div>
</div>

将第一个复选框绑定到第二个复选框是我当前的代码:

$('#slideThree').click(function()  { < -- - this works fine.
    $('#specification-input-21-1358').click();
});

$('#specification-input-21-1358').click(function() {
    if ($('#slideThree').length) {
        if ($('#slidethree').checked) < -- - problem is here.
        $('#slideThree').attr('checked', false);
        else
            $('#slideThree').attr('checked', true);
    }
});
  
      
  • 问题是,如果我单击第一个复选框,则第二个复选框不会更改。

  •   
  • 另一个问题是,如果我刷新页面第一复选框,则复选框保持选中状态,但第二个复选框将不被选中。

  •   

有关我的代码的更多详细信息:

我的代码中有一个Ajax过滤器模块,其中包含一些checkboxes(与Amazon相同),每个复选框都是我产品的属性。因此,当我检查其中之一时,网站的产品列表将使用ajax更新。 checkboxes之一是:show only avail Product,如果我单击它,它将用ajax更新产品列表以仅显示可用产品。 我还在此页面的顶部添加了另一个复选框(具有不同的样式),与该复选框相同。我的目的是让客户不要错过可以使用此复选框的功能。 我希望两个checkboxes都一样。 因此,如果客户检查其中一个,则必须检查另一个。如果他们取消选中其中一个,则另一个必须取消选中。

3 个答案:

答案 0 :(得分:1)

您可以按照以下方式进行操作:

  $('#specification-input-21-1358, #slideThree').click(function() {
    if ($('#slideThree').length)
      $('#specification-input-21-1358, #slideThree').prop('checked', $(this).is(':checked'));
  });

Online demo (jsFiddle)

答案 1 :(得分:0)

最简单的方法是将class属性添加到两个元素

<input data-option-ids="1358" id="specification-input-21-1358" class="specification-input-21-1358" type="checkbox">

然后您就可以用它执行ajax调用了。

$('.specification-input-21-1358').change(function() {
   //ajax
});

答案 2 :(得分:0)

如下更新代码:

$('#slideThree').click(function() {
    $('#specification-input-21-1358').click();
});

$('#specification-input-21-1358').click(function() {
    if ($('#slideThree').length) {  
        $('#slideThree').prop('checked', $(this).prop('checked'));
    }
});

您可以在下面对其进行测试。

//if product page is refreshing while ajax filter is already clicked it will work inverse (when checked ajax filter is uncheked)

$('#slideThree').click(function() {
  $('#specification-input-21-1358').click();
});

$('#specification-input-21-1358').click(function() {
  if ($('#slideThree').length) {
    $('#slideThree').prop('checked', $(this).prop('checked'));
  }
});
// it's ajax filter and will updated product list of website with ajax and i don't want modify this
$('#specification-input-21-1358').change(function() {
  var i = n(this),
    r = i.closest("div[data-optionsGroupId]"),
    u = new t;
  u.requestProductsForSelectedFilters(r, i)
});
.availButton p {
  display: inline-block;
  vertical-align: middle;
  padding-top: 5px;
  padding-left: 10px;
  direction: rtl;
  font-family: m2hweb;
  color: green;
  margin-bottom: 10px;
  direction: ltr;
}

.slideThree::before {
  content: 'ON';
  font: 12px/26px Arial, sans-serif;
  font-weight: normal;
  color: #00bf00;
  position: absolute;
  left: 10px;
  z-index: 0;
  font-weight: bold;
}

.slideThree::after {
  content: 'OFF';
  font: 12px/26px Arial, sans-serif;
  font-weight: normal;
  color: #000;
  position: absolute;
  right: 10px;
  z-index: 0;
  font-weight: bold;
  text-shadow: 1px 1px 0 rgba(255, 255, 255, .15);
}

.slideThree input[type="checkbox"] {
  visibility: hidden;
}

.slideThree input[type="checkbox"]:checked+label {
  left: 43px;
}

.slideThree label {
  display: block;
  width: 34px;
  height: 20px;
  -webkit-border-radius: 50px;
  -moz-border-radius: 50px;
  border-radius: 50px;
  -webkit-transition: all .4s ease;
  -moz-transition: all .4s ease;
  -o-transition: all .4s ease;
  transition: all .4s ease;
  cursor: pointer;
  position: absolute;
  top: 3px;
  left: 3px;
  z-index: 1;
  -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .3);
  -moz-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .3);
  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .3);
  background: #fcfff4;
  background: -webkit-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
  background: -moz-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
  background: -o-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
  background: -ms-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
  background: linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fcfff4', endColorstr='#b3bead', GradientType=0);
}

.slideThree {
  width: 80px;
  height: 26px;
  background: #333;
  margin: 0 auto;
  display: inline-block;
  -webkit-border-radius: 50px;
  -moz-border-radius: 50px;
  border-radius: 50px;
  position: relative;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .5), 0 1px 0 rgba(255, 255, 255, .2);
  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .5), 0 1px 0 rgba(255, 255, 255, .2);
  box-shadow: inset 0 1px 1px rgba(0, 0, 0, .5), 0 1px 0 rgba(255, 255, 255, .2);
}

.slideThree::after {
  content: 'OFF';
  font: 12px/26px Arial, sans-serif;
  font-weight: normal;
  color: #000;
  position: absolute;
  right: 10px;
  z-index: 0;
  font-weight: bold;
  text-shadow: 1px 1px 0 rgba(255, 255, 255, .15);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="availButton">
  <p dir="rtl" style="text-align: left;">Show Only Available product :</p>

  <div class="slideThree"><input id="slideThree" name="check" type="checkbox"> <label for="slideThree"></label></div>
</div>

<ul class="checkbox-list">
  <li class="checkbox-item checkbox">
    <input data-option-ids="1358" id="specification-input-21-1358" type="checkbox">
    <label class="filter-item-name" for="specification-input-21-1358" data-originaltext="Available Product">Available Product</label>
  </li>
</ul>