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