Lo siguiente puede ser útil en términos generales.
Primero, los campos de formulario HTML están limitados a texto . Esto se aplica especialmente a los cuadros de texto, incluso si se ha esforzado para garantizar que el valor se vea como un número.
En segundo lugar, JavaScript, para bien o para mal, ha sobrecargado al +operador con dos significados: agrega números y concatena cadenas. Tiene preferencia por la concatenación, por lo que incluso una expresión como 3+'4'se tratará como concatenación.
En tercer lugar, JavaScript intentará cambiar los tipos dinámicamente si puede y si es necesario. Por ejemplo '2'*'3', cambiará ambos tipos a números, ya que no puede multiplicar cadenas. Si uno de ellos es incompatible, obtendrá NaNNo es un número.
Su problema ocurre porque los datos que provienen del formulario se consideran una cadena y +, por lo tanto, se concatenarán en lugar de agregarse.
Al leer datos supuestamente numéricos de un formulario, siempre debe pasarlos parseInt()o parseFloat(), dependiendo de si desea un entero o un decimal.
Tenga en cuenta que ninguna función convierte verdaderamente una cadena en un número. En su lugar, analizará la cadena de izquierda a derecha hasta que llegue a un carácter numérico no válido o al final y convierta lo que se ha aceptado. En el caso de parseFloat, eso incluye un punto decimal, pero no dos.
Cualquier cosa después del número válido simplemente se ignora. Fallan si la cadena ni siquiera comienza como un número. Entonces lo conseguirás NaN.
Una buena técnica de propósito general para números de formularios es algo como esto:
var data=parseInt(form.elements['data'].value); // or parseFloat
Si está preparado para fusionar una cadena no válida a 0, puede usar:
var data=parseInt(form.elements['data'].value) || 0;