复选框 检查事件侦听器

IT技术 javascript html google-chrome google-chrome-extension dom-events
2021-01-24 06:07:12

最近我一直在使用 Chrome 插件 API,我正在寻找一个插件,它可以让我更轻松地管理网站。

现在我想做的是在选中某个复选框时触发一个事件。由于本网站不属于我,我无法更改代码,因此我使用的是 Chrome API。主要问题之一是没有 ID,而是有名称。我想知道是否可以在选中带有“名称”的特定复选框后触发该功能。

3个回答

简短回答:使用change事件。这里有几个实际的例子。由于我误读了这个问题,我将包括 jQuery 示例和纯 JavaScript。但是,通过使用 jQuery,您并没有获得太多(如果有的话)。

单个复选框

使用querySelector.

var checkbox = document.querySelector("input[name=checkbox]");

checkbox.addEventListener('change', function() {
  if (this.checked) {
    console.log("Checkbox is checked..");
  } else {
    console.log("Checkbox is not checked..");
  }
});
<input type="checkbox" name="checkbox" />

带有 jQ​​uery 的单个复选框

$('input[name=checkbox]').change(function() {
  if ($(this).is(':checked')) {
    console.log("Checkbox is checked..")
  } else {
    console.log("Checkbox is not checked..")
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="checkbox" name="checkbox" />

多个复选框

这是复选框列表的示例。要选择多个元素,我们使用querySelectorAll而不是querySelector. 然后使用Array.filterArray.map提取检查值。

// Select all checkboxes with the name 'settings' using querySelectorAll.
var checkboxes = document.querySelectorAll("input[type=checkbox][name=settings]");
let enabledSettings = []

/*
For IE11 support, replace arrow functions with normal functions and
use a polyfill for Array.forEach:
https://vanillajstoolkit.com/polyfills/arrayforeach/
*/

// Use Array.forEach to add an event listener to each checkbox.
checkboxes.forEach(function(checkbox) {
  checkbox.addEventListener('change', function() {
    enabledSettings = 
      Array.from(checkboxes) // Convert checkboxes to an array to use filter and map.
      .filter(i => i.checked) // Use Array.filter to remove unchecked checkboxes.
      .map(i => i.value) // Use Array.map to extract only the checkbox values from the array of objects.
      
    console.log(enabledSettings)
  })
});
<label>
   <input type="checkbox" name="settings" value="forcefield">
   Enable forcefield
</label>
<label>
  <input type="checkbox" name="settings" value="invisibilitycloak">
  Enable invisibility cloak
</label>
<label>
  <input type="checkbox" name="settings" value="warpspeed">
  Enable warp speed
</label>

jQuery 的多个复选框

let checkboxes = $("input[type=checkbox][name=settings]")
let enabledSettings = [];

// Attach a change event handler to the checkboxes.
checkboxes.change(function() {
  enabledSettings = checkboxes
    .filter(":checked") // Filter out unchecked boxes.
    .map(function() { // Extract values using jQuery map.
      return this.value;
    }) 
    .get() // Get array.
    
  console.log(enabledSettings);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label>
   <input type="checkbox" name="settings" value="forcefield">
   Enable forcefield
</label>
<label>
  <input type="checkbox" name="settings" value="invisibilitycloak">
  Enable invisibility cloak
</label>
<label>
  <input type="checkbox" name="settings" value="warpspeed">
  Enable warp speed
</label>

Using the jQuery-like querySelector ...嗯,不是“类似 jQuery”的(感觉很想投反对票)
2021-03-22 06:07:12
我的意思是 jQuery 在 Javascript 中广泛使用了查询选择器。在它们出现之前,选择和查找元素是一件麻烦事。
2021-03-30 06:07:12
总是使用addEventListener而不是直接事件onchange来进一步兼容。
2021-04-04 06:07:12
@thordarsononchange不添加事件侦听器。它取代了现有的。这意味着您仅使用一个事件阻止该对象,并且可能不适用于使用同一对象的其他插件或脚本。如果我有一个“开始聊天”按钮,我希望它被其他主题、插件或脚本所吸引。
2021-04-05 06:07:12
@dino onchange受所有浏览器支持,除了可能适合或不适合您的特定项目的用例外,on[event] 和 addEventListener 之间绝对没有区别请告诉我我的答案应该以何种方式被否决。它不回答问题吗?
2021-04-09 06:07:12

由于我没有jQuery在 OP 中看到该标签,这里是一个使用javascript 的选项:

document.addEventListener("DOMContentLoaded", function (event) {
    var _selector = document.querySelector('input[name=myCheckbox]');
    _selector.addEventListener('change', function (event) {
        if (_selector.checked) {
            // do something if checked
        } else {
            // do something else otherwise
        }
    });
});

JSFIDDLE

为什么要在 _selector 变量中添加下划线?
2021-03-21 06:07:12
你可以这样做: if (event.target.checked){ //do something }else{ //do something }
2021-03-23 06:07:12
你是对的,我当时就赞成你的回答。我使用 querySelector 方法添加了一个 jQuery 免费选项。
2021-04-02 06:07:12
@SabU 有成千上万种方法可以做同样的事情;)
2021-04-11 06:07:12
@Linus:没有技术原因。我相信在回答时我正在与客户合作,其中函数中的所有私有变量都以下划线开头,我想我无意识地以同样的方式回答。没有它们它也能工作jsfiddle.net/13pog9L8 请注意在变量中使用或不使用下划线的重要一点是整个代码(您的或您工作的公司)的一致性
2021-04-14 06:07:12

如果您的 html 中有一个复选框,例如:

<input id="conducted" type = "checkbox" name="party" value="0">

并且您想使用 javascript 在此复选框中添加一个 EventListener,在关联的 js 文件中,您可以执行以下操作:

checkbox = document.getElementById('conducted');

checkbox.addEventListener('change', e => {

    if(e.target.checked){
        //do something
    }

});
这是最好的答案,值应该从传入的事件中确定,而不是外部选择器 :-)
2021-03-16 06:07:12