我有一个jQuery函数,它提示用户输入,它有一个回调函数,可以将文本作为新项添加到屏幕上的select元素中。问题是回调多次运行(见下文)
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;
}
似乎发生的事情是它第一次运行良好,并且单个项目被附加到列表中。当它第二次运行时,附加两个项目,当它第三次运行时,附加三个项目,依此类推。添加的项的值都是正确的(即屏幕上输入框的值),我只是无法理解为什么回调多次运行。
我很感激任何帮助。我已经无法在S.O上找到任何与此问题有关的内容。
由于
答案 0 :(得分: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;
}