0

我有一个使用 iCheck 样式的复选框。这部分工作正常。我的问题是我想在每次更改时将复选框状态保存在我的数据库中。但是我的 ajax 请求只在第一次触发。

我有这样的设置:

HTML:

<ul class='tasks'>
   <li><input type=checkbox rel='module' data='1' name=done[]  class='taskStatus'>Text</li>
</ul>

jQuery

$("input[type=checkbox]").on("ifClicked", function(){
    alert("init");

    var stateObj = {
        id: $(this).attr("data"),
        mode: $(this).attr("rel"),
        state: null
    };

    if($(this).prop("checked") === false){
        stateObj.state = 1;
    } else {
        stateObj.state = 0;
    }

    updateState(stateObj);
});


function updateState(stateObj){
    alert("updating");

    $.ajax({
        url: "moduleAjax.php?module=" + stateObj.mode + "&page=eventState",
        type: "POST",
        data: "obj=" + JSON.stringify(stateObj), 
        success: function(data){
            alert(data);
        },
        error: function(a, b, c){
            alert("error");
        }
    });
}

我试图注释掉 ajax 请求。这样做,警报框会按应有的方式触发。

我有一个解决方法添加 window.location.reload(); 警报(数据)之后。但在我看来,这不应该是必要的。我也尝试过异步发送请求:false;模式没有成功。我没主意了。

问题

为什么在发送 ajax 请求时,不是在每次点击时触发 ifClicked 事件,而只是第一次触发?

附加信息

执行脚本时,控制台中没有错误。没有任何警报第二次运行。

我什至无法在 jsfiddle 中重现该问题。

有任何线索的人吗?

编辑

我刚刚使用新的 iCheck beta 源代码进行了测试。然后事件会被触发,但是会引发其他一些问题。所以这似乎源于 iCheck 的一个错误。(但我可能是错的)。

4

2 回答 2

0

在 Ajax 响应之后重新初始化事件处理程序怎么样?

$(function () {
    initClickedHandler();
});

function initClickedHandler(){
    $("input[type=checkbox]").on("ifClicked", function(){
            alert("init");
            var stateObj = {
                id: $(this).attr("data"),
                mode: $(this).attr("rel"),
                state: null
            }

            if($(this).prop("checked") === false){
                stateObj.state = 1;
            }
            else{
                stateObj.state = 0;
            }
            updateState(stateObj)
    });
}


function updateState(stateObj){
    alert("updating");
    $.ajax({
        url: "moduleAjax.php?module=" + stateObj.mode + "&page=eventState",
        type: "POST",
        data: "obj=" + JSON.stringify(stateObj), 
        success: function(data){
            alert(data);
            initClickedHandler();
        },
        error: function(a, b, c){
            alert("error");
        }
    });
}

此外,您在 updateState(stateObj) 之后缺少一个分号

于 2014-05-23T18:23:19.030 回答
0

您可以通过使用 jQuery 的.click()方法 ( jsfiddle ) 完全避免这个问题:

$('input[type="checkbox"]').on('click', function() {

    var stateObj = {
        id: $(this).attr("data"),
        mode: $(this).attr("rel"),
        state: null
    }

    if( $(this).prop('checked') === false ) {
        stateObj.state = 1;
    } else {
        stateObj.state = 0;   
    }

    updateState(stateObj);
});

function updateState(stateObj) {
    console.log(stateObj.state);   
}
于 2014-05-23T18:27:36.530 回答