jQuery:一个按钮,它检查自己的 DIV 中的所有复选框并取消选中所有其他复选框

Posted

技术标签:

【中文标题】jQuery:一个按钮,它检查自己的 DIV 中的所有复选框并取消选中所有其他复选框【英文标题】:jQuery: A button that checks all checkboxes in its own DIV and unchecks all the others 【发布时间】:2020-09-30 06:02:14 【问题描述】:

我有一个动态生成的表单,其中包含代表公司类别的复选框组。这些最终被绘制在动态图表上(此处未显示)。每组公司都在一个 div 中,每个 div 都有一个名为 Only 的按钮,该按钮应选中其自己类别 (div) 中的所有复选框,并取消选中页面上的所有其他复选框。

这是一个包含所有代码的小提琴:https://jsfiddle.net/c2kn78a9/

按钮中包含以下代码:

// Uncheck all checkboxes outside this div
$(this).closest("div").not(this).find('input[type=checkbox]').prop('checked', false).change();

// Check all checkboxes in this div
$(this).closest("div").find('input[type=checkbox]').prop('checked', true).change();

但它不起作用。知道如何解决这个问题吗?

这是整个页面的代码。

<!-- This button is different than the other buttons -->
<button class="button-text" id="customize-button">Open User Settings</button>

<!-- Placeholder for dynamic form -->
<div id="company-selection-form"></div>

<script type="text/javascript">

function toMachineString(humanString) 
  var machineString = humanString.replace(/\s+/g, '-').toLowerCase();
  machineString = machineString.replace('&','');
  return machineString;


// Setup the form
var categories = new Map([
  ['Tech Giants',['Alphabet','Amazon','Apple','Facebook','Microsoft']], 
  ['Handset Manufacturers',['Apple','Samsung','Motorola','Sony']],
  ['Semiconductors', ['AMD','Intel','Nvidia']]
  //  ... more ...
  ]);

// Build company selection form inputs
let companySelectionhtml = '';

for (let category of categories) 

  categoryName = category[0];
  categoryList = category[1];

  // Setup a div to differentiate each category of companies.
  // Will be used for turning on/off categories en masse
  companySelectionHTML += `<div id="$toMachineString(categoryName)">\n`;

  // Category heading
  companySelectionHTML += `<h4>$categoryName</h4>\n`;

  // Only button
  companySelectionHTML += `<button class="only" id="btn-only-$toMachineString(categoryName)">Only</button>\n`;

  categoryList.forEach(companyName => 

    companySelectionHTML += `
      <label class="checkbox-label">
          <input id="x-$toMachineString(companyName)" class="checkbox" type="checkbox" name="company" value="$companyName" checked>
          <label for="x-$toMachineString(companyName)">$companyName</label>
      </label>`;
  );

  companySelectionHTML += '</div>\n</div>\n</div>\n';


// Append to DOM
const companySelectionId = document.getElementById('company-selection-form');
companySelectionId.insertAdjacentHTML('beforeend', companySelectionHTML);

// Make the ONLY buttons check all the checkboxes in their div and uncheck everything else
$(document).ready(function() 
  $(document).on("click", ".only", function() 

    // Uncheck all checkboxes outside this div
    $(this).closest("div").not(this).find('input[type=checkbox]').prop('checked', false).change();

    // Check all checkboxes in this div
    $(this).closest("div").find('input[type=checkbox]').prop('checked', true).change();

  );
);

</script>

谢谢!

【问题讨论】:

同时添加您的 HTML 代码,以使这个问题更容易理解。 HTML 代码确实存在。请记住,表单是动态生成的。 【参考方案1】:

您的.not(this) 正在尝试从最近的单个 div 中过滤掉按钮元素。您需要获取页面上的所有 div 并删除最接近“this”按钮的 div。

像这样从你的 JSFiddle 中:

var temp = $(this).closest("div");
$("div").not(temp).find('input[type=checkbox]').prop('checked', false).change();

OR(避免新变量)

$("div").not($(this).closest("div")).find('input[type=checkbox]').prop('checked', false).change();

【讨论】:

我无法让任何一个示例工作。你有没有机会把它放到 Fiddle 中进行测试? 哦,等等,对不起,我搞砸了。它工作得很好。谢谢!【参考方案2】:

Matt G 的解决方案工作正常,它取消选择页面上的所有复选框。 我建议通过首先将选择范围缩小到您的#company-selection-form 来进一步完善它

  `$("#company-selection-form")
    .find("div")
    .not($(this)
    .closest("div"))
    .find('input[type=checkbox]')
    .prop('checked', false)
    .change();`

尽管如此,请允许我建议您学习这些东西可能是在浪费时间。这种编程范式太成问题且不合时宜。它很慢,很快就会失控,除了痛苦之外什么都没有。即使是最轻微的 UI 更新也会迫使您重新访问(有时几个月后)、调试和重写您的代码。它永远无法测试,甚至没有人会费心对其进行严格测试。

我的意思是,如果你的雇主每天都拿枪指着你的脑袋,而你必须选择这样做还是死,那么你很快就会选择死于这场磨难。

【讨论】:

:) 你没有错。但如果你相信的话,这是用于业余项目的代码!

以上是关于jQuery:一个按钮,它检查自己的 DIV 中的所有复选框并取消选中所有其他复选框的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - 选择嵌套在 div ul li 中的特定按钮

如何删除检查数据库的div

检查 div 是不是使用 jQuery 隐藏

jQuery使用同一类的多个按钮返回一个值[重复]

jQuery单选按钮“选中”属性未触发

选择单选按钮时显示 div