【问题标题】:html checkboxes associative array - how to access this array in javascript?html 复选框关联数组 - 如何在 javascript 中访问此数组?
【发布时间】:2021-10-05 01:22:54
【问题描述】:

我正在尝试这样做:

<input type="checkbox" name="appliances[microwave]">
<input type="checkbox" name="appliances[coffee-machine]">
<input type="checkbox" name="appliances[grill]">

并像这样在javascript中访问这个数组

1.

var myarr = document.getElementsByName('appliances');
alert('here ' + myarr);

结果:警报显示“此处 [object NodeList]”

2.

var myarr = document.getElementsByName('appliances');
    alert('here ' + myarr['grill']);

结果:警报显示“此处未定义”

我怎样才能访问这个数组?

【问题讨论】:

    标签: javascript html arrays checkbox associative


    【解决方案1】:

    就 HTML 而言,您的元素都有不同的名称,"appliances[microwave]""appliances[coffee-machine]" 等。这些名称仅对某些软件是特殊的(例如,PHP 将在表单提交时处理它们)。

    您可以使用querySelectorAll 和选择器input[name^=appliances] 来查找名称​​以appliances 开头的所有元素。然后您通过索引(0、1 和 2)访问该 NodeList 中的条目:

    const checkboxes = document.querySelectorAll("input[name^=appliances]");
    for (let n = 0; n < checkboxes.length; ++n) {
        console.log(`${checkboxes[n].name} checked? ${checkboxes[n].checked}`);
    }
    <input type="checkbox" checked name="appliances[microwave]">
    <input type="checkbox" name="appliances[coffee-machine]">
    <input type="checkbox" name="appliances[grill]">
    <!-- A fourth one just to show that it won't get selected: -->
    <input type="checkbox" name="something-else">

    如果您想通过[] 中的名称访问它们,您可以创建一个对象并将它们作为属性放在对象上:

    function getNamedElementObject(baseName) {
        const result = {};
        // NOTE: The next line assumes there are no `]` characters in `name`
        const list = document.querySelectorAll(`[name^=${baseName}]`);
        for (const element of list) {
            const match = element.name.match(/\[([^]+)\]/);
            if (match) {
                const propName = match[1]
                result[propName] = element;
            }
        }
        return result;
    }
    
    const checkboxes = getNamedElementObject("appliances");
    console.log(`checkboxes["microwave"].checked? ${checkboxes["microwave"].checked}`);
    console.log(`checkboxes["coffee-machine"].checked? ${checkboxes["coffee-machine"].checked}`);
    console.log(`checkboxes["grill"].checked? ${checkboxes["grill"].checked}`);
    // You could also loop through by getting an array from `Object.values`:
    for (const checkbox of Object.values(checkboxes)) {
        console.log(`${checkbox.name} checked? ${checkbox.checked}`);
    }
    <input type="checkbox" checked name="appliances[microwave]">
    <input type="checkbox" name="appliances[coffee-machine]">
    <input type="checkbox" name="appliances[grill]">
    <!-- A fourth one just to show that it won't get selected: -->
    <input type="checkbox" name="something-else">

    或者你可以使用Map:

    function getNamedElementMap(baseName) {
        const result = new Map();
        // NOTE: The next line assumes there are no `]` characters in `name`
        const list = document.querySelectorAll(`[name^=${baseName}]`);
        for (const element of list) {
            const match = element.name.match(/\[([^]+)\]/);
            if (match) {
                const propName = match[1]
                result.set(propName, element);
            }
        }
        return result;
    }
    
    const checkboxes = getNamedElementMap("appliances");
    console.log(`checkboxes.get("microwave").checked? ${checkboxes.get("microwave").checked}`);
    console.log(`checkboxes.get("coffee-machine").checked? ${checkboxes.get("coffee-machine").checked}`);
    console.log(`checkboxes.get("grill").checked? ${checkboxes.get("grill").checked}`);
    // You could also loop through via the iterator from the `values` method:
    for (const checkbox of checkboxes.values()) {
        console.log(`${checkbox.name} checked? ${checkbox.checked}`);
    }
    <input type="checkbox" checked name="appliances[microwave]">
    <input type="checkbox" name="appliances[coffee-machine]">
    <input type="checkbox" name="appliances[grill]">
    <!-- A fourth one just to show that it won't get selected: -->
    <input type="checkbox" name="something-else">

    【讨论】:

    • 非常感谢。它工作正常!还有一个问题 - 你能解释一下 ^= 操作吗?
    • 非常感谢您提供更多信息。还有一个问题 - 你为什么使用 const 而不是简单的变量?
    • @KirillUniversum - consts 也很简单。 :-) 这只是一种风格。每当我不打算更改“变量”的内容时,我都会使用const。这样,以后在对代码进行维护时,如果我尝试更改变量的内容,我会收到一个错误——这提醒我,当我编写代码时,我假设变量的值不会改变,我检查在将其更改为let 之前确保该假设不重要,以便我可以更改它。但是let 也可以。 (var 也可以,但我不建议在新代码中使用它。letconst 具有块作用域。)
    猜你喜欢
    • 2011-02-01
    • 2013-02-14
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多