2013-09-16 5 views
0

У меня есть функция jQuery, которая запрашивает ввод пользователя, который имеет функцию обратного вызова для добавления текста в качестве нового элемента в экранном элементе select. Проблема заключается в том, что обратный вызов выполняется несколько раз (см ниже)jQuery callback работает несколько раз

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

Что, кажется, происходит в первый раз он работает все хорошо, и один элемент добавляется в список. Когда он запускается второй раз, добавляются два элемента, когда он запускается в третий раз, добавляются три элемента и т. Д. Значения добавленных элементов правильны (т. Е. Значение поля ввода на экране), я просто не могу понять, почему обратный вызов работает несколько раз.

Буду признателен за любую помощь. Я еще не смог найти что-то, что конкретно связано с этой проблемой на S.O.

Благодаря

+0

скорее всего т его событие связано несколько раз. Сколько раз выполняется 'PrepareScanner'? –

+0

Только один раз, насколько я могу судить. Scan

+0

Установите оповещение или console.log внутри, чтобы подтвердить. Я не вижу другого способа, чтобы его вызывали не один раз. –

ответ

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; 
} 
Смежные вопросы