JQuery ajax在切换切换时多次执行

时间:2017-08-08 12:19:49

标签: javascript jquery ajax laravel-5 laravel-blade

我有一个所有插座的表格列表,我有一个物化CSS按钮来激活或停用插座,

@foreach($outlets as $outlet)
<tr>
    <td>
        <div class="switch m-b-md" data-id="{{$outlet->id}}">
            <label>
                @if($outlet->status == 'active')
                    <input id="agent-status" type="checkbox" checked="">
                @else
                    <input id="agent-status" type="checkbox">
                @endif
                <span class="lever"></span>
            </label>
        </div>
    </td>
</tr>
@endforeach

问题是当我点击.switch ajax正在多次执行时,如果我继续切换它正在执行超过5到10次

$(document).on("click", ".switch", function() {

    var outlet_id = $(this).data('id');

    $(".switch").find("input[type=checkbox]").on("change",function() {

        var status = $(this).prop('checked');

        if(status == true) {
            status = "active";
        } else {
            status = "inactive";
        }

        $.ajax ({
            url: '/manager/outlets/'+outlet_id+'/status',
            type: 'POST',              
            data: {"id": outlet_id, "status": status, "_token": '{{ csrf_token() }}'},
            success: function(data)
            {   
                if(data.status==true) {
                    swal("Updated", "Status updated successfully", "success");
                } else if(data.status==false) {
                    swal("Failed", "Fail to update status try again", "error");
                }
            },
            error: function(error)
            {
                swal("Failed", "Fail to update status try again", "error");
            }
        });

    });

});

谢谢

3 个答案:

答案 0 :(得分:2)

您只需将事件侦听器分开并使用outlet_id作为闭包,即可从两个侦听器访问它。见下文:

    var outlet_id;

    $(document).on("click", ".switch", function() {

        outlet_id = $(this).data('id');

    });

    $(".switch").find("input[type=checkbox]").on("change",function() {

        var status = $(this).prop('checked');

        if(status == true) {
            status = "active";
        } else {
            status = "inactive";
        }

        $.ajax ({
            url: '/manager/outlets/'+outlet_id+'/status',
            type: 'POST',
            data: {"id": outlet_id, "status": status, "_token": '{{ csrf_token() }}'},
            success: function(data)
            {
                if(data.status==true) {
                    swal("Updated", "Status updated successfully", "success");
                } else if(data.status==false) {
                    swal("Failed", "Fail to update status try again", "error");
                }
            },
            error: function(error)
            {
                swal("Failed", "Fail to update status try again", "error");
            }
        });

    });

答案 1 :(得分:1)

你的循环创建了多个具有相同类switch的div,当你点击该类时,switch类的所有div都会调用ajax个帖子。因此,请为您循环中的每个div id

<div class="switch m-b-md" id="div_{{$outlet->id}}" onclick="callAjax('div_{{$outlet->id}}')">

您的ajax

function callAjax(divid){

   //do your ajax call here.....

}

答案 2 :(得分:1)

它正在发生,因为每次单击一个开关时,都会添加一个监听器,你不应该有这个嵌套的监听器,

我要做的是为所有输入类型复选框添加复选框更改的委托功能,我会给这些输入一个类来简化我的选择

$(".switch").on('change','.CheckBoxClass', function(){
var theid = $(this).parent('.switch').data('id');
var status = $(this).prop('checked');
//add the rest of your code
});