Ошибка jQuery «не удается прочитать свойство ‘call’ неопределенного»

#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() over bind() начиная с 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 тип, который, я думаю, более элегантный