【问题标题】:jQuery toggle switch checkbox - changing "checked" attribute delayjQuery切换开关复选框 - 更改“已检查”属性延迟
【发布时间】:2018-02-15 17:36:16
【问题描述】:

我创建了一个切换开关复选框并应用了以下逻辑:

1] 如果用户点击切换开关class="os_section-slider",脚本将检查是否检查了包含元素名称的input

1-A] 如果元素被选中,则将其更改为未选中并将该元素添加到名为os_tagsToRemove的数组中

1-B] 如果元素未选中,则将其更改为选中并将该元素添加到名为 os_tagsToAdd 的数组中

HTML

<span class="os_section-name">first</span>
<input type="checkbox" class="os_section-check" id="first" checked="checked">
<label class="os_section-slider" for="first"></label>

<div class="line-space-between"></div>

<span class="os_section-name">second</span>
<input type="checkbox" class="os_section-check" id="second">
<label class="os_section-slider" for="second"></label>

JS

$(".os_section-slider").click(function() {
    if($(this).prev().is(":checked")) {   //if checked
        $(this).prev().attr("checked", false);
        var os_tagName = $(this).prev().attr("id").toString();
        os_tagsToRemove.push(os_tagName);
        os_tagsToAdd.splice($.inArray(os_tagName, os_tagsToAdd),1);
    } else {    //if unchecked
        $(this).prev().attr("checked", true);
        var os_tagName = $(this).prev().attr("id").toString();
        os_tagsToAdd.push(os_tagName);
        os_tagsToRemove.splice($.inArray(os_tagName, os_tagsToRemove),1);
    }
});

我的问题是,当我的页面重新加载并且我的切换开关出现在模式框中并且我尝试单击切换器按钮时,我必须单击 2 次,直到添加/删除选中的属性。

第一次单击始终只将值推入数组或将其从数组中删除,但不适用于$(this).prev().attr("checked", true);$(this).prev().attr("checked", false);

但在第二次点击每个切换器按钮后,从那一刻起一切正常。

【问题讨论】:

  • 我不明白你如何点击你的空标签...我不明白你为什么在标签上而不是复选框上附加点击事件。解释一下。
  • @LouysPatriceBessette 我需要我的脚本以更改页面源代码的方式更改每个元素的选中属性。当您有一个默认复选框时,如果您选中/取消选中元素的输入,它不会将checked="checked" 硬编码到页面的源代码中。
  • 哈...好吧,这是关于默认检查...等一下。

标签: javascript jquery checkbox togglebutton


【解决方案1】:

添加这个来加载你的添加/删除数组:

// Onload remove array fill
$("[type='checkbox']").each(function(){
  if( $(this).is(":checked") ){
    os_tagsToRemove.push($(this).attr("id"));
  }else{
    os_tagsToAdd.push($(this).attr("id"));
  }
});

然后,你的逻辑就完全颠倒了。

首先,当您单击定义为for="anID" 的标签时,对应复选框的选中状态已经改变。您不必编写脚本。

然后,当您查看是否已选中时,您必须知道此验证是在复选框状态更改后进行的。所以我颠倒了你的if 条件。

var os_tagsToAdd = [];
var os_tagsToRemove = [];

$(".os_section-slider").click(function() {
  console.clear();

  var os_tagName = $(this).prev().attr("id");

  //if checked AFTER the click
  if($(this).prev().is(":checked")) {
    if($.inArray(os_tagName, os_tagsToAdd) == -1){
      os_tagsToAdd.push(os_tagName);
    }
    os_tagsToRemove.splice($.inArray(os_tagName, os_tagsToRemove),1);

    //if unchecked AFTER the click
  } else {
    if($.inArray(os_tagName, os_tagsToRemove) == -1){
      os_tagsToRemove.push(os_tagName);
    }
    os_tagsToAdd.splice($.inArray(os_tagName, os_tagsToAdd),1);
  }

  console.log( os_tagsToAdd );
  console.log( os_tagsToRemove );
});

// Onload remove array fill
$("[type='checkbox']").each(function(){
  if( $(this).is(":checked") ){
    os_tagsToRemove.push($(this).attr("id"));
  }else{
    os_tagsToAdd.push($(this).attr("id"));
  }
});

console.log( os_tagsToAdd );
console.log( os_tagsToRemove );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<span class="os_section-name">first</span>
<input type="checkbox" class="os_section-check" id="first" checked="checked">
<label class="os_section-slider" for="first">Label</label>

<div class="line-space-between"></div>

<span class="os_section-name">second</span>
<input type="checkbox" class="os_section-check" id="second">
<label class="os_section-slider" for="second">Label</label>

【讨论】:

  • 您的脚本已修复。如果不清楚,请随时提出问题!
  • 请注意,直接单击复选框会弄乱一切……但我想您还是使用了一些不错的 CSS 来隐藏它。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2017-03-07
相关资源
最近更新 更多