0

我有一个 jQuery 函数,它提示用户输入,它有一个回调函数,可以将文本作为新项目附加到屏幕上的选择元素中。问题是回调运行多次(见下文)

getText() 方法显示一个带有输入元素的自定义弹出窗口:

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;
}   

似乎发生的事情是它第一次运行时一切正常,并且单个项目被附加到列表中。当它第二次运行时,附加两个项目,当它第三次运行时,附加三个项目,依此类推。添加的项目的值都是正确的(即屏幕上输入框的值),我只是不明白为什么回调运行多次。

我会很感激任何帮助。我已经无法在 SO 上找到与此问题特别相关的任何内容。

谢谢

4

1 回答 1

1

我已经弄清楚了(感谢 Kevin 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 回答