【问题标题】:javascript checkbox checkd but not updating UI选中了 javascript 复选框但未更新 UI
【发布时间】:2016-04-04 21:35:42
【问题描述】:

我编写了一个脚本来检查复选框,当我单击它的相应图像时。 图像的 ID 类似于 checkbox-img-1,复选框输入的 ID 类似于 checkbox-1,用于第一对复选框和图像。第二对 id 是 checkbox-img-2checkbox-2 等等。 因此,每当我单击图像时,我都想选中相应的复选框。对于少数图像,UI 正在更新,但对于少数图像,它没有得到更新。 可能的问题是什么?我搜索了一下,但所有问题都犯了用 attr 代替 prop 的错误。 我的脚本是纯javascript。我尝试使用 jQuery,但我遇到了同样的错误。 我发现没有选择不存在或尚未显示在前面的内容。 javascript代码是:

/* Check option on image click */
        $(".option-check-img").click(function () {
            var checkbox_img_id = $(this).attr("id");
            var checkbox_id     = checkbox_img_id.replace("checkbox-img", "checkbox");
            if(document.getElementById(checkbox_id).checked)
            {
                document.getElementById(checkbox_id).checked = false;
                var d = document.getElementById(checkbox_img_id);
                d.className = "img-circle pointer";
                /*$("#checkbox_id").prop("checked", false);
                $("#checkbox_img_id").removeClass("img-border");
                console.log(document.getElementById(checkbox_id));*/
            }
            else
            {
                document.getElementById(checkbox_id).checked = true;
                var d = document.getElementById(checkbox_img_id);
                d.className += " img-border";
                /*$("#checkbox_id").prop("checked", true);
                $("#checkbox_img_id").addClass("img-border");
                console.log(document.getElementById(checkbox_id));*/
            }
        });

有什么解决办法吗?谢谢。

【问题讨论】:

  • 你能上传代码来fiddle吗?
  • 您好,html+php(magento)中的代码。复选框从 db 中检索。这对小提琴不起作用。
  • @SwapnilBhikule,你能从浏览器中获取生成的 html 并用它创建一个小提琴吗?
  • @Anbarasan 我把它放在我的开发网站troopr.in 上。在下面的主页中,我们有表单标签/魔术搜索。在那个神奇的搜索中没有更新 UI。

标签: javascript jquery html checkbox


【解决方案1】:

尝试使用 prop() 代替 attr()

JQuery Script not checking check-boxes correctly

阅读文档以获取更多信息jQuery prop()

【讨论】:

  • 嗨,在我的注释代码中,我正在使用 prop。但它也不起作用!我正在寻找答案,所有人都在使用 attr 时犯了同样的错误,但在我的情况下,这不是问题。
  • OP已经提到他使用.prop而不是.attr和jquery你可以看到注释掉的代码。
【解决方案2】:

您确定要为此使用 js 吗?只需使用 css 即可。

*, *:before,  *:after {
  font-family: sans-serif;
  box-sizing: border-box;
}

label {
  display: block;
  margin-bottom: 20px;
  cursor: pointer;
}

span:before {
  content: '';
  
  display: inline-block; 
  width: 15px;
  height: 15px;
  margin-right: 10px;
  
  background: white; /* you can place your image url here */
  border: 4px solid white;
  border-radius: 3px;
  box-shadow: 0 0 0 1px black; 
}

input {
  display: none;
}

input:checked + span:before {
  background: black;
}
<label>
  <input type="checkbox">
  <span>Checkbox 1</span>
</label>
<label>
  <input type="checkbox">
  <span>Checkbox 2</span>
</label>

【讨论】:

    【解决方案3】:

    有一个纯html解决方案(Fiddle):

    <ul><li>
      <input type="checkbox" id="checkbox-1" />
      <label for="checkbox-1"><img /></label>
    </li>
    <li>
      <input type="checkbox" id="checkbox-2" />
      <label for="checkbox-2"><img /></label>
    </li></ul>
    

    如果您需要在选中复选框时为图像添加样式,您可以使用 css3 (Fiddle):

    input:checked + label img{
      border: 1px solid black;
    }
    
    input:not(:checked) + label img{
      border: 1px solid green;
    }
    
    // If you want to hide the checkbox
    input[type=checkbox] {
      display: none;
    }
    

    您应该构建您的 html,使复选框和图像彼此相邻。

    这种方法更加优雅,并且不使用不必要的 javascript。

    【讨论】:

    • 您好,谢谢您的回答。但是我使用的是 js,因为我的复选框在滑块中,并且我使用了很多 css 作为结构。使用 CSS 可能会变得更复杂。
    【解决方案4】:
                $(".option-check-img").click(function() {
                var $this = $(this);
                var checkbox_img_id = $(this).attr("id");
                var checkbox_id = checkbox_img_id.replace("checkbox-img", "checkbox");
                if ($("#" + checkbox_id + ":checked").length) {
                    $("#" + checkbox_id).prop('checked', false);
                    $("#" + checkbox_img_id).removeClass("img-border");
                    $("#" + checkbox_img_id).addClass("img-circle pointer");
                } else {
                    $("#" + checkbox_id).prop('checked', true);
                    $("#" + checkbox_img_id).removeClass("img-circle pointer");
                    $("#" + checkbox_img_id).addClass("img-border");
                }
            });
    

    将您的代码转换为正确的jQuery 代码。

    假设: ID 属于您的复选框元素。

    确保您的 DOM 中没有任何元素具有相同的 ID。

    更新了代码以删除备用类。

    谢谢

    【讨论】:

    • 您好,感谢您的回答。但它也不起作用。很少有复选框被选中,很少有固定复选框没有被点击。
    • 这里的“固定复选框”是什么意思?最好为你的场景创建 jsFiddle。
    • 如果我有 id 为 checkbox-1、checkbox-2、checkbox-3 和 checkbox-4 的复选框。然后在发布问题之前,checkbox-3 没有更新 UI。现在有了你的答案,checkbox-3 没有更新 UI。
    • 如果您已结合 ID 编写 CSS 规则,则问题可能出在您的 CSS 上。可能您错过了为“checkbox-3”之类的 ID 更新您的 CSS 并休息其他人。
    • 我只为 javascript 或 jquery 使用 ID,所有 css 属性都由类定义。
    【解决方案5】:

    您的复选框 ID 不是唯一的

    具有相同 id 的不同复选框被选中/取消选中,而不是您要操作的复选框。 getElementById / $('#id') 将只返回它首先找到的一个元素。

    例如,在您分享的链接中,选项 Party 的 id 为 checkbox-24 但具有相同 id 的复选框共有三个。 p>

    对于 ID 为 checkbox-27Music 类似,同样有 3 个具有该 ID 的复选框实例。

    您的脚本是正确的,但 id 不是唯一的。使 id 唯一或使用其他标识符或标识符组合来唯一标识您要操作的复选框。

    【讨论】:

    • 嗨,是的,我使用开发工具得到了同样的结果,但是当我通过右键单击打开页面源代码然后选择查看页面源代码时,我只得到一个复选框 24。
    【解决方案6】:

    问题在于无限循环。没有无限循环它的工作。但我仍然想要那个无限的滑块,所以我会尝试一些不同的东西。

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多