ok. empecemos por analizar esto
todos los valores desde un form en javascript se reciben como cadenas por lo tanto las operaciones aritméticas te resultan en errores, deberías utilizar parseInt, o parseFloat para transformar dichas cadenas '45367' en números 45367
Te pongo un ejemplo (que aclaro tiene muchas imperfecciones), pero para que te des una idea
Código HTML:
Ver original<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript"> //<![CDATA[
function totales(elid){
var identificador = elid.split('_');
var registro = identificador[1];
if(document.getElementById('cantidad_'+registro).value == ''){
var cantidad = 0;
}else{
var cantidad = parseInt(document.getElementById('cantidad_'+registro).value);
}
var valor = parseInt(document.getElementById('valor_'+registro).value);
var total = cantidad*valor;
document.getElementById('total_'+registro).value = total;
}
//]]>
<td><input type="text" id="cantidad_1" onkeyup="totales(this.id)" /></td><td><input type="text" id="valor_1" onkeyup="totales(this.id)" /></td><td><input type="text" id="total_1" /></td>
fijate que la suma solo se produce si tanto cantidad como contienen números. Y yo usaría el evento onkeyup en lugar de onchange.
Ademá no aclarás si el campo cantidad es editable, por ejemplo cantidad 6 precio 3 te pòne 18, pero si modificas cantidad y no volvés al campo precio a cambiar algo, no te arregla el total, por lo que la función debería hacerse siempre en los 2 campos supongo