#javascript #jquery
#javascript #jquery
Вопрос:
Я программист на Java, пытающийся написать немного JavaScript. Потерпите меня.
Я хотел бы функцию, которая обновляет итоговое значение при вводе цифры в любое из полей ввода в таблице. У меня есть следующая строка в $(document).ready(function() { ... }
$("#lineCountTable").find('input').each().bind('keyup', function() {
updateTotal(this);
});
На экране отладки Chrome я получаю:
Неперехваченная ошибка типа: не удается прочитать ‘вызов’ свойства undefined». Номер строки, на которую указывает jQuery-1.8.2.js:611.
Я полагаю, что у меня синтаксическая ошибка при определении вызываемой функции. updateTotal(inputVar)
Функция должным образом определена позже в файле JS; в случае, если кому-то интересно, это:
function updateTotal(inputVar) {
var row = inputVar.closest('tr');
var lineCharge = row.find("dlsRowCharge").html().trim();
var total = 0.0
var lineCount = inputVar.val();
if (isNumeric(lineCount)) {
total = math.abs(lineCount * lineCharge).toFixed(2);
row.children(".dlsRowTotal").html("$ " total);
}
}
Я знаю, что эти функции обычно ставятся встроенными; я бы предпочел определить их отдельно и вызвать, если это невозможно.
Комментарии:
1. Удалите пустое
each()
и используйтеon()
вместоbind()
2. Параметр функции для
$.fn.each()
является обязательным, и в любом случае, просто использовать.each()
не имеет смысла3. @arcy Ya, как и большинство прототипов метода jQuery, он внутренне перебирает согласованный набор
4. Кроме того,
this
будет элемент DOM, который вы не можете вызватьclosest()
— вам нужно обернуть его в объект jQuery. Вашfind()
селектор также неверен, предположительно, ему нужен.
префикс класса5. @RoryMcCrossan В некоторых браузерах вы можете , но вы правы, очевидно, не то, что ожидал OP (потому что тогда он вызывает
find()/html()/val()
)
Ответ №1:
Здесь у вас есть несколько проблем:
each()
требуется функция-обработчик и является причиной вашей ошибки. Тем не менее, в данном случае это не требуется.- вы должны использовать
on()
overbind()
начиная с jQuery 1.7. this
будет элементом DOM, для которого вы не можете вызватьclosest()
метод jQuery. По общему признанию, существует собственныйclosest()
метод, но он пока не поддерживается должным образом. Для надежной работы кода вам необходимо обернутьthis
в объект jQuery.find()
требуется допустимый селектор, которогоdlsRowCharge
нет. Предположительно, это должно быть.dlsRowCharge
math
должно бытьMath
Учитывая все сказанное, попробуйте это:
$("#lineCountTable").find('input').on('keyup', function() {
updateTotal($(this));
});
function updateTotal($inputVar) {
var $row = $inputVar.closest('tr');
var lineCharge = $row.find("dlsRowCharge").html().trim();
var lineCount = parseFloat($inputVar.val()) || 0;
var total = Math.abs(lineCount * lineCharge).toFixed(2);
$row.children('.dlsRowTotal').html('$ ' total);
}
Комментарии:
1. Какой хороший полный ответ — хотелось бы, чтобы нажатие кнопки upvote сработало более одного раза. Спасибо. Боюсь, я не знаю, что означает ‘wrap
this
в объекте jQuery», но предположу, что это воплощено в вашем примере.2. ах, почти наверняка $ () вокруг ‘this’ в вызове. Мне действительно придется сесть за книгу по jQuery, поскольку в остальном работа хорошая, и от меня продолжают ожидать выполнения этих вещей…
3. Если у вас будет возможность, быстро просмотрите список методов jQuery: api.jquery.com . Даже если вы не вдаваетесь в подробности, просто названия методов дают вам представление о том, что можно сделать.
4. Для придирчивости —
lineCharge
должно обрабатываться так же, какlineCount
. Таким образом, это может быть число, нечисловая строка и пустое значение — поэтому значения, которые оно будет иметь, будут: float, NaN или 0. Кроме того, проверка операционной системы, является ли значениеtotal
числом, должна быть сохранена, но для каждогоisNaN
(в настоящее время пользователь вводит значение «a» в поле ввода, общее значение равно «NaN»; в идеале это должно представлять какое-то сообщение). Это также может быть обработано, еслиinput
имеетnumber
тип, который, я думаю, более элегантный