Следующее может быть полезно в общих чертах.
Во-первых, поля формы HTML ограничены текстом . Это особенно относится к текстовым полям, даже если вы приложили все усилия, чтобы значение выглядело как число.
Во-вторых, JavaScript, к лучшему или к худшему, перегружал +оператора двумя значениями: он добавляет числа и объединяет строки. У него есть предпочтение для конкатенации, поэтому даже выражение like 3+'4'будет рассматриваться как конкатенация.
В-третьих, JavaScript будет пытаться динамически изменять типы, если это возможно, и при необходимости. Например '2'*'3', оба типа будут заменены числами, поскольку вы не можете умножать строки. Если один из них несовместим, вы получите NaN, а не номер.
Ваша проблема возникает из-за того, что данные, поступающие из формы, рассматриваются как строка, а + поэтому они будут объединяться, а не добавляться.
Читая предположительно числовые данные из формы, вы всегда должны проталкивать их parseInt()илиparseFloat() , в зависимости от того, хотите ли вы целое или десятичное число.
Обратите внимание, что ни одна из функций действительно не преобразует строку в число. Вместо этого он будет анализировать строку слева направо, пока не достигнет недопустимого числового символа или до конца, и преобразует то, что было принято. В случаеparseFloat , это включает в себя один десятичный знак, но не два.
Все, что находится после действительного номера, просто игнорируется. Они терпят неудачу, если строка даже не начинается как число. Тогда вы получите NaN.
Хорошая техника общего назначения для чисел из форм выглядит примерно так:
var data=parseInt(form.elements['data'].value); // or parseFloat
Если вы готовы объединить недопустимую строку в 0, вы можете использовать:
var data=parseInt(form.elements['data'].value) || 0;