0

画面上の選択要素にテキストを新しいアイテムとして追加するコールバック関数を持つユーザー入力を求めるjQuery関数があります。問題は、コールバックが複数回実行されていることです (以下を参照)。

getText() メソッドは、input 要素を含むカスタム ポップアップを表示します。

function getText(c, cb, elem) {
    var cb = cb || false;
    var elem = elem || false;

    $("#lims_gettext_caption").html(c);
    $("#lims_gettext").show();
    $("#lims_gettext_respond").click(cb);

    $("body").keyup(function(e){
        if (e.keyCode == 27) {
            $('#lims_gettext').hide();
            $("body").unbind("keyup");
        }   
    });
}

getText() は別のメソッドから呼び出され、ユーザーが画面上の特定のリンクをクリックすると実行されます。

function PrepareScanner(row) {
    var codes = $("#barcode" + row).size();
    var txt = (codes == 1 ? "first" : "next");

    getText("Please scan " + txt + " barcode", function() {
        var bc = $("#lims_gettext_value").val();
        $("#barcode" + row).append("<option value=1>" + bc + "</option>");
    });

    $("#lims_gettext_value").focus();
    $("#lims_gettext_value").val("");

    return;
}   

最初に実行したときはすべて問題なく、1 つの項目がリストに追加されます。2 回目に実行すると 2 つのアイテムが追加され、3 回目に実行すると 3 つのアイテムが追加されます。追加されたアイテムの値はすべて正しいです (つまり、画面上の入力ボックスの値)。なぜコールバックが複数回実行されているのか理解できません。

助けていただければ幸いです。SOでこの問題に特に関連するものはまだ見つかりませんでした。

ありがとう

4

1 に答える 1

1

私はそれを理解することができました(あなたの意見についてケビンBに感謝します)

問題の原因となったのは次の行であり、コールバック関数自体でバインドを解除する必要がありました。

$("#lims_gettext_respond").click(cb);

したがって、調整された PrepareScanner 関数は次のとおりです。

function PrepareScanner(row) {
    var codes = $("#barcode" + row).size();
    var txt = (codes == 1 ? "first" : "next");

    getText("Please scan " + txt + " barcode", function() {
        var bc = $("#lims_gettext_value").val();
        $("#barcode" + row).append("<option value=1>" + bc + "</option>");
        $("#lims_gettext_respond").unbind("click");
    });

    $("#lims_gettext_value").focus();
    $("#lims_gettext_value").val("");

    return;
}   
于 2013-09-17T12:36:13.540 に答える