当通过选择页面上所有复选框的 jQuery 脚本选中复选框时,如何触发自定义 javascript 事件?

How do I trigger a custom javascript event when a checkbox is selected via a jQuery script that selects all checkboxes on a page?

我目前正在一家摄影店网站上工作。客户将被允许在一个页面上查看 100-500 张图像的照片集。我希望这些客户能够单击选中页面上所有复选框的 "Select All" 按钮(或其他元素)。在 Stack Overflow 上进行研究后,我目前正在使用 jQuery 成功完成此 "Select All" 功能。

目前,我正在使用的代码在照片集中的每个图像上放置了一个复选框。如果用户单击复选框,它会触发一个自定义事件。但是,我希望复选框处于选中状态(或从未选中状态变为选中状态)来触发事件,而不是点击。如果点击触发事件,Select 我使用 jQuery 的所有功能将无法工作,因为 jQuery 不是 "clicking" 页面上的每个复选框,仅将复选框更改为选中。这意味着自定义事件不会加载。

当前用于通过单击(我不想这样做)来触发我需要的事件的代码是:

$('.select-product').on('click', this.QuickOrder.loadProduct);

我尝试开发的代码不工作,但它是这样的:

    $('.select-product').change(function(){
            var isChecked = $(this).is(':checked');
            if(isChecked) { 
                this.QuickOrder.loadProduct;
            }
        });

我在研究并发现 change 函数记录了复选框状态的变化后使用了 .change() 函数。当此条件变为真时,我希望 QuickOrder.loadProduct 触发。之后,一切正常。

这是我的jQuery"Select All"脚本供参考:

    $(document).ready(function() {
     $("#select_all").change(function(){
         if(this.checked){
        $(".select-product").each(function(){
            this.checked=true;
        })              
    }else{
        $(".select-product").each(function(){
            this.checked=false;
        })              
    }
});

$(".select-product").click(function () {
    if (!$(this).is(":checked")){
        $("#select_all").prop("checked", false);
    }else{
        var flag = 0;
        $(".select-product").each(function(){
            if(!this.checked)
            flag=1;
        })              
                    if(flag == 0){ $("#select_all").prop("checked", true);}
    }
});
});

关于如何实现这一点有什么想法吗?谢谢!

Why isn't my checkbox change event triggered? 中所述:

The change event does not fire when you programmatically change the value of a check box.

下面我给出两个解决方案(第一个来自前面提到的link):

1: 更改checkbox设置后显式触发change事件

this.checked = true;
$(this).trigger('change');

2:只需以编程方式委托给点击事件。

$(this).trigger('click');

演示:

window.loadProduct = function(id) { alert('loadProduct() called on #'+id+'.'); };

// propagate select-all checkbox changes to all individual checkboxes
$("#select_all").change(function() {
    if (this.checked) {
        $(".select-product").each(function() {
            // original code
            //this.checked = true;
            // solution #1: explicitly force a change event
            this.checked = true;
            $(this).trigger('change');
            // solution #2: trigger click
            //$(this).trigger('click');
        });
    } else {
        $(".select-product").each(function() {
            this.checked = false;
        });
    } // end if
});

// propagate individual checkbox changes back to the select-all checkbox
$(".select-product").click(function() {
    if (!$(this).is(":checked")) {
        $("#select_all").prop("checked", false );
    } else {
        var flag = 0;
        $(".select-product").each(function() {
            if (!this.checked)
                flag = 1;
        });
        if (flag == 0) {
            $("#select_all").prop("checked", true );
        } // end if
    } // end if
});

// call loadProduct() for any change of an individual checkbox
$('.select-product').change(function() {
    var isChecked = $(this).is(':checked');
    if (isChecked) {
        loadProduct(this.id);
    } // end if
});
.select_container {
    margin-bottom:8px;
}

.img_container {
    display:flex;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="select_container">
    <input id="select_all" type="checkbox"/>
</div>
<div class="img_container">
    <div>
        <div><img src="https://www.gravatar.com/avatar/4fa45261dec56004145c653832504920?s=128&d=identicon&r=PG&f=1"/></div>
        <input id="check1" class="select-product" type="checkbox"/>
    </div>
    <div>
        <div><img src="https://www.gravatar.com/avatar/fc03f6eed7d4d5e3233c5dde9f48480d?s=128&d=identicon&r=PG&f=1"/></div>
        <input id="check2" class="select-product" type="checkbox"/>
    </div>
    <div>
        <div><img src="https://www.gravatar.com/avatar/fd882c2b5e410936a4a607b2e87465d9?s=128&d=identicon&r=PG&f=1"/></div>
        <input id="check3" class="select-product" type="checkbox"/>
    </div>
</div>