jQuery - 根据 attr 值仅获取选中复选框的唯一值

Posted

技术标签:

【中文标题】jQuery - 根据 attr 值仅获取选中复选框的唯一值【英文标题】:jQuery - Get only the unique values of checked checkboxes based on an attr value 【发布时间】:2021-11-13 09:25:33 【问题描述】:

我正在遍历一些复选框并为每个选中的复选框执行 .ajax 调用。问题是每个复选框的名称属性可能是重复的。所以我只想为具有唯一名称属性的复选框设置 .ajax。

这是我的脚本

var elements = $("input:checkbox:checked")

var i = 0;
doLoop();

function doLoop() 
    if ( i >= elements.length ) 
        return;
    

    // To get the element we are up to: $(elements[i])
    let e = $(elements[i]);
    var id = e.attr('name');
    var val = e.val();
    $.ajax(
        async : false,
        url:"import.php",
        method:"POST",
        data:id:id, val:val,
        success:function(data) 
            //do some action
            i++
            doLoop()
        
    );

我试图在这里找到一些类似的主题,但没有成功。

如果我选中了以下复选框

<input type="checkbox" class="form-check-input selected-checkbox" value="some text 1" name="smalltalk">
<input type="checkbox" class="form-check-input selected-checkbox" value="some text 2" name="smalltalk">
<input type="checkbox" class="form-check-input selected-checkbox" value="some text 3" name="smalltalk">
<input type="checkbox" class="form-check-input selected-checkbox" value="some text 4" name="smalltalk">

每个名称属性 smalltalk 应该只调用一次,而不是 4 次 .ajax 调用。

【问题讨论】:

【参考方案1】:

我决定采用一种简单(不确定从性能角度来看效果如何)的方法。

在 .ajax 成功后,我已将 id 值分配给另一个名为 cid (cid = id;) 的变量,因此我可以获取通过 .ajax 的最后一个值,然后将循环中的新值与最后一个值 (if (id != cid) )。

这就是我最终得到的结果

var elements = $("input:checkbox:checked")
var cid;
var i = 0;
doLoop();

function doLoop() 
    if ( i >= elements.length ) 
        return;
    

    // To get the element we are up to: $(elements[i])
    let e = $(elements[i]);
    var id = e.attr('name');
    var val = e.val();
    if (id != cid) 
        $.ajax(
            async : false,
            url:"import.php",
            method:"POST",
            data:id:id, val:val,
            success:function(data) 
                cid = id;
                //do some action
                i++
                doLoop()
             
        );
     else 
        s++;
        doiLoop();
        
  

【讨论】:

【参考方案2】:

您可以使用 jQuery .serializeArray() 方法为您提供整个表单的数据:

let data = $('form').serializeArray();
console.log( data );

输出:

[
        "name": "smalltalk",
        "value": "some text 1"
    ,
    
        "name": "smalltalk",
        "value": "some text 3"
    ,
    
        "name": "other",
        "value": "some other text 2"
    ,
    
        "name": "other",
        "value": "some other text 4"
    
]

您可以根据需要重新组织例如:

let groupedData = Object.entries(data.reduce((acc, cur) => (
    ...acc,
    [cur.name]: (acc[cur.name] || []).concat(cur.value)
), ));
console.log( groupedData );

输出:

[
    [
        "smalltalk",
        [
            "some text 1",
            "some text 3"
        ]
    ],
    [
        "other",
        [
            "some other text 2",
            "some other text 4"
        ]
    ]
]  

演示

let data = $('form').serializeArray();
console.log( data );
console.log( data.reduce((acc,cur) => (...acc,[cur.name]:(acc[cur.name] || []).concat(cur.value)),) );
console.log( Object.entries( data.reduce((acc,cur) => (...acc,[cur.name]:(acc[cur.name] || []).concat(cur.value)),) ) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
SmallTalk
<input type="checkbox" class="form-check-input selected-checkbox" value="some text 1" name="smalltalk" checked>
<input type="checkbox" class="form-check-input selected-checkbox" value="some text 2" name="smalltalk">
<input type="checkbox" class="form-check-input selected-checkbox" value="some text 3" name="smalltalk" checked>
<input type="checkbox" class="form-check-input selected-checkbox" value="some text 4" name="smalltalk">
<br><br>
Other
<input type="checkbox" class="form-check-input selected-checkbox" value="some other text 1" name="other">
<input type="checkbox" class="form-check-input selected-checkbox" value="some other text 2" name="other" checked>
<input type="checkbox" class="form-check-input selected-checkbox" value="some other text 3" name="other">
<input type="checkbox" class="form-check-input selected-checkbox" value="some other text 4" name="other" checked>
</form>

【讨论】:

感谢您的建议。我决定将 .ajax 中名称 attr 的值分配给另一个变量,然后在 .ajax 之前检查当前匹配是否持续。我会发布更新。

以上是关于jQuery - 根据 attr 值仅获取选中复选框的唯一值的主要内容,如果未能解决你的问题,请参考以下文章

Django Modelmultiplechoicefield Checkboxselectmultiple 获取选中复选框的问题

jquery中input复选框的checked属性

jquery复选框 选中事件 及其判断是否被选中

再次选中jQuery复选框

jquery实现全选和反选功能

复选框值不能基于选中或使用jquery取消选中来更改[重复]