Почему не вызывается вторая функция javascript?

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

Я пытаюсь вызвать две функции javascript для отдельных событий. Вот код вызова моей функции.

 <input type="text" name="cbh" id="c8"  value="0"  onkeypress="return isNumberKey(event);calculate();" />
  

Первая функция, разрешающая только числа, и у нее следующий рабочий процесс.

     function isNumberKey(evt)
{
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 amp;amp; (charCode < 48 || charCode > 57))
    return false;



    return true;
}
  

Для целей отладки функция sencond содержит всего одну строку.

 function calculate()
{
    alert("ok");

}
  

Теперь первая функция вызывается на 100% нормально. Но вторая функция, похоже, не вызывается. Есть предложения?

Редактировать: я хочу вызвать вторую функцию после выполнения первой функции.

Ответ №1:

Потому что вы возвращаетесь после первого вызова.

Если вы хотите пропустить вторую, если первая возвращает false:

 onkeypress="if (isNumberKey(event)) { calculate(); return true; } else { return false; }"
  

Если обе должны возвращать статус, а вторая должна выполняться только в том случае, если первая возвращает true:

 onkeypress="return isNumberKey(event) amp;amp; calculate();"
  

Комментарии:

1. Спасибо, чувак, это сработало. Я могу принять ваш ответ в качестве ответа через десять минут 🙂

Ответ №2:

Вы возвращаетесь из onkeypress обработчика сразу после вызова первой функции:

 onkeypress="return isNumberKey(event);calculate();"
  

В javascript игнорируется все, что следует за return оператором. Итак, что вы хотите здесь, так это иметь функцию, которая сначала определяет, является ли аргумент числом, и вычисляет:

 function handlePress(evt) {
    var result = isNumberKey(evt);
    calculate();
    return resu<
}
  

и затем:

 onkeypress="return handlePress(event);"
  

Вы могли бы написать эту логику в HTML напрямую, не вводя третью функцию, но, ИМХО, смешивать HTML и javascript подобным образом плохо. Я бы даже ненавязчиво прикрепил это событие onkeypress вместо использования onkeypress атрибута на входе:

 window.onload = function() {
    var c8 = document.getElementById('c8');
    if (c8 != null) {
        c8.onkeypress = function(evt) {
            var result = isNumberKey(evt);
            calculate();
            return resu<
        };
    }
};
  

и в html:

 <input type="text" name="cbh" id="c8" value="0" />
  

Теперь у нас есть четкое разделение между javascript и разметкой. Еще одним преимуществом этого является то, что уменьшается размер вашей разметки, а поскольку статические ресурсы, такие как файлы javascript, кэшируются, вы ограничиваете использование полосы пропускания и ускоряете работу своего сайта.

Ответ №3:

 onkeypress="var r = isNumberKey(event);calculate();return r;"
  

Ответ №4:

вторая функция вызывается после возврата события. интерпретатор никогда не достигнет ее. изменение на

 var isNumber = isNumberKey(evt);calculate(); return isNumber;
  

устраняет эту конкретную проблему, но у вас будут проблемы с межбраузерностью и навязчивым кодом, с которым придется иметь дело

Ответ №5:

return завершит работу любой функции, в которой вы находитесь (включая анонимную, сгенерированную onclick атрибутом).

Вы, вероятно, хотите что-то вроде:

 var value = isNumberKey(event);
calculate();
return value;
  

или

 onclick="var value = isNumberKey(event);calculate();return value;"
  

Ответ №6:

Поскольку у вас есть оператор return, второй оператор не будет достигнут.

Вам было бы лучше иметь одну функцию-обработчик, а затем отправлять больше функций, например

onkeypress=myonkeypress

 function myonkeypress() {
  if (isNumberKey()) {
    calculate();
  }
}
  

Ответ №7:

Я бы предложил поместить вызов alert () внутри функции, которую вы пытаетесь отладить.

Поскольку это предназначено только для отладки, после завершения отладки требуется меньше кода для очистки: вам нужно только удалить свои инструкции alert и вам не нужно беспокоиться ни о чем другом (т. Е. удалить дополнительный вызов функции из вашего события onkeypress.

Таким образом, вы можете избавиться от своей функции calculate () и просто обновить свою функцию isNumberKey следующим образом:

 function isNumberKey(evt)
{
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 amp;amp; (charCode < 48 || charCode > 57))
    {
         alert("isNumberKey FALSE");
         return false;
    }

    alert("isNumberKey TRUE");
    return true;
}