0

私はこれを解決する方法を見つけられないようです..だから私はいくつかの助けが必要になると思います..私はsqliteデータベースを持っているphonegapアプリケーションを作っています。私はクエリを実行し、動的に結果を取得しますデータベースからdivを作成しました。これは、抽出したレコードごとに、編集可能な役割を持つボタンとして、それを含むdivを作成するためのものです。

たとえば、これらの列IDがoption1 option2のdbがあり、3つのレコードがあるとします。これは、必要な3つのdivがあり、各divがボタンになるため、ユーザーがクリックすると、次のことができるようになります。たとえば、idを気にせずに削除(または編集/更新)クエリを実行します。彼がdiv2を選択した場合は、2番目のレコードを削除するクエリを実行します。

これまでの私のコード..

for (var i = 0; i < len; i++) {
    var test1 = results.rows.item(i).option1;
    var d = new Date();
    d.setTime(results.rows.item(i).date);
    var newLI = document.createElement("LI");
    newLI.className = lt;
    newLI.id = results.rows.item(i).id;
    var container = ("<div id=\"" + results.rows.item(i).id + "\" class=\"test\"><div id=\"text\">option1</div><div id=\"data\">" + test1 + "</div></div>");
    newLI.innerHTML = cont;
    var gl = document.getElementById("sqltest");
    gl.appendChild(newLI);
}
for (var i = 0; i < len; i++) {
    var divid = "#" + results.rows.item(i).id;
    $(divid).on("click", function () {
        alert(divid);
    })
}

<ul id="sqltest"></ul>

上記のコードの問題は、各divが正しいIDを取得しているにもかかわらず、それをクリックすると、3つのdivがある場合でも、インスタンス#1に対して常に同じ結果が得られることです。

div1 alert #1 div2 alert #2 

私は得る

div1 alert #1 div2 alert#1

私はそれを単純化するためだけにアラートを使用しましたが、アラートの代わりにDELETE from SQLDB WHERE id=results.rows.item(i).id;

4

1 に答える 1

1

javascriptのスコープとクロージャが機能する方法のため、常に同じ「divid」変数を取得しています。これは非常によくある間違いです。これに関する詳細情報を取得するには、「javascriptクロージャ悪名高いループ」をグーグルで検索できます。

forを次のように置き換える必要があります。

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

    (function () {
        var divid = "#" + results.rows.item(i).id;
        $(divid).on("click", function () {
            alert(divid);
        });
    })();
}

このようにして、変数dividは毎回異なるスコープで宣言されます。

それがあなたが抱えている唯一の問題であるかどうか私は理解していませんでした。

于 2012-10-12T04:07:31.590 に答える