javascript不断循环

时间:2012-10-13 03:25:33

标签: javascript cordova for-loop scope

继续here ...因为问题已明显改变(在我看来)

这是我的代码

        for (var i = 0; i < len; i++) {
            (function () {
                var queryid = results.rows.item(i).id; //sql primary key
                var divid = "#" + queryid; //assigned id to divs
                var pressTimer;
                $(divid).mouseup(function(){ //func to handle tap + hold
                clearTimeout(pressTimer)
                // Clear timeout
                return false;
                }).mousedown(function(){
                // Set timeout
                pressTimer = window.setTimeout(function() {
                alert(divid);
                $(".somediv").show();
                $("#anotherdiv").hide();
                $("#button").on("click", function(){
                    var db = window.openDatabase("mydb", "1.0", "mydb", 200000);
                    db.transaction(editrow);    
                    function editrow(tx){
                        var value1 = $("#inputbox1").val();
                        var value2 = $("#inputbox2").val();
                        tx.executeSql("UPDATE mydb SET column1 = " + value1 + ", column2 = " + value2 + " WHERE id = " + queryid);
                        alert(divid); ********
                        successCB();} //query function
                })
                },1000)
                return false; 
                });
                })();
            }   

如果我点击div并编辑值,则会成功提交... 但是,如果之后我选择另一个div来更新其字段,那么新值将更新为选定的div,以及之前选择的div ..

例如我选择div1并更新值一切正常

如果之后我选择了div2,那么div1和div2值都会更新为div2的更新值

1 个答案:

答案 0 :(得分:1)

您不止一次绑定事件。在div中的每个mousedown中,您都将click事件绑定到按钮。当你在jquery中调用“on”或“click”时,你不是 asigning 事件处理程序,你添加处理程序。

我不明白你是否需要调用setTimeout。

试试这个aproach insted:

var lastClickedId = null;
function editrow(tx) {
    var value1 = $("#inputbox1").val();
    var value2 = $("#inputbox2").val();
    var queryid = lastClickedId;
    tx.executeSql("UPDATE mydb SET column1 = " + value1 + ", column2 = " + value2 + " WHERE id = " + queryid);
    alert(queryid);
    lastClickedId = null;

    successCB();
} //query function

$("#button").on("click", function(){

    if(lastClickedId != null)
    {
        var db = window.openDatabase("mydb", "1.0", "mydb", 200000);
        db.transaction(editrow);
    }
});

for (var i = 0; i < len; i++) {

    (function () {
        var queryid = results.rows.item(i).id; //sql primary key
        var divid = "#" + queryid; //assigned id to divs

        $(divid).click(function(){
            lastClickedId = queryid;
        });
    })();
}

<强>更新

使用 bind(func) on(func) click(func)等绑定jquery中的元素时,你是注册函数 func ,以便在事件发生时调用。您可以注册任意数量的功能。所以,例如,如果你这样做:

$("#div1").on("click", function() { alert("hello"); });
$("#div1").on("click", function() { alert("world"); });

单击时会显示两个警报。这是因为jquery管理事件的方式。它会调用您在事件中传递的每个函数。

要使用 分离您在该元素(或多个元素)上发布的所有点击事件,只需执行以下操作:

$("#div1").off("click");

在“纯”javascript中你可以这样做:

var div1 = document.getElementById("div1");

div1.onclick = function() { alert("hello"); };
div1.onclick = function() { alert("world"); };

在第二个示例中,只会调用一个警报,因为您直接将值赋予函数onclick。 并删除该事件:

div1.onclick = null;