Решение Кампо Хаваскрипт с вычислениями

Я должен нажимать два раза на кнопку считать для того, чтобы последнее поле вышло правильно. Я сделал маленькое очень короткое видео для того, чтобы они могли видеть, который я имею в виду: Видео Youtube проблемы javascript Восток - мой код:

//función que se ejecuta cada vez que se añade una letra en un cuadro de         texto
//suma los valores de los cuadros de texto

function sumar()
{
  var dolar = 18;
  var porcentaje = 100;
  var valor1=verificar("valor1");
  var valor2=verificar("valor2");
  var valor3=verificar("valor3");
  var valor4=verificar("valor4");
  var valor5=verificar("valor5");
  x = parseFloat(valor1);
  y = parseFloat(valor1)*parseFloat(dolar);
  z = parseFloat(valor1)/porcentaje*10;
  f = parseFloat(valor2)+parseFloat(valor4);

  // realizamos la suma de los valores y los ponemos en la casilla del
  // formulario que contiene el total

  document.getElementById("valor2").value= x;

  document.getElementById("valor3").value= y;

  document.getElementById("valor4").value= z;

  document.getElementById("valor5").value= f;

}

//función para verificar los valores de los cuadros de texto. si no es         un valor
//numérico, cambia de color el borde del cuadro de texto

function verificar(id)
{
  var obj=document.getElementById(id);
  if(obj.value=="")
    value="0";
  else
    value=obj.value;
  if(validate_importe(value,1))
  {
    // marcamos como erróneo
    obj.style.borderColor="#808080";
    return value;
  }else{
    // marcamos como erróneo
    obj.style.borderColor="#f00";
    return 0;
  }
}

//Función para validar el importe
//Tiene que recibir: El valor del importe
//Determinar si permite o no decimales
//Devuelve: true - Correcto , False - Incorrecto

function validate_importe(value,decimal)
{
  if(decimal==undefined)
    decimal=0;

  if(decimal==1)
  {
    // Permite decimales tanto por . como por ,
    var patron=new RegExp("^[0-9]+((,|\.)[0-9]{1,2})?$");
  }else{
    // Número entero normal
    var patron=new RegExp("^([0-9])*$")
    }

  if(value && value.search(patron)==0)
  {
    return true;
  }
  return false;
}
.auto-style1 { text-align: center; }
.auto-style2 { background-image: url('img/bg_calculo_dolares.jpg');  }
.auto-style3 { border-width: 0px; }
.auto-style4 { text-align: left; font-family: Arial, Helvetica, sans-serif; }
.auto-style5 { font-size: 55pt; }
.auto-style6 { text-align: left; }
.auto-style7 { text-align: left; font-family: Arial,Helvetica, sans-serif; font-size: 55pt; }
.auto-style8 { font-family: Arial, Helvetica, sans-serif; }
.auto-style9 { font-size: 55pt; font-weight: bold; }
.auto-style10 { text-align: right; }
.auto-style11 { font-size: 55pt; color: #00A743; }


  
    
    Remesas ENVIA - Calculo en dolares
    
  

  

    
     

 

        Si envias a Mexico

        $ dolares

        tu familia recibe

        $ pesos,

        tu envio cuesta

        $ dolares

        tu pago total es de

        $ dolares


0
задан 15.03.2016, 00:40
1 ответ

Внутри функции sumar() эта часть кода:

var dolar = 18;
var porcentaje = 100;
var valor1=verificar("valor1");
var valor2=verificar("valor2");
var valor3=verificar("valor3");
var valor4=verificar("valor4");
var valor5=verificar("valor5");
x = parseFloat(valor1);
y = parseFloat(valor1)*parseFloat(dolar);
z = parseFloat(valor1)/porcentaje*10;
f = parseFloat(valor2)+parseFloat(valor4);

он произведет неправильные результаты для первого раза, который назовется, благодаря тому, что операции для той, кто вычисляет стоимость f возьми данные косвенно DOM (через названные к функциям verificar() и не используй стоимость, заблаговременно вычисленные x, y, z. Давайте видеть то, что происходит:

  1. Когда загружают страницу первый раз, вся стоимость input типа text их 0.0. Неудар в лунку типа number у него нет стандартной настройки, так что он "".
  2. Выполнив метод sumar() первый раз, стоимость valor1 в valor5 это возвращенные функцией verificar(), что, начиная с id, который проходит с ним как параметр, получает стоимость, у которой есть в этом моменте каждый неудар в лунку. Как все, кроме valor1 у них есть по умолчанию 0.0, проверка правильна и verificar() возврати эту же самую стоимость для valor2 ... valor5. Для valor1, мы предполагаем ввод (в этом случае 100) она правильна, следовательно стоимость valor1 его 100.
  3. Обрати стоимость текста '100' в тип float, сейчас переменная x он равен 100.0
  4. Умножь стоимость текста '100', конвертируемые в float со стоимостью доллара, конвертируемого в float: сейчас переменная y он равен 1800 ( parseFloat переменной dolar он не является действительно необходимым).
  5. Раздели стоимость текста '100', конвертируемые в float и он это разделяет со стоимостью переменной porcentaje умноженная на 100. Сейчас переменная f он равен 10.
  6. Сложи стоимость текста '0.0' со стоимостью текста '0.0'. Почему? потому что он действует на переменных valor2 и valor4 что содержат в этом моменте эту стоимость, и не на вычислениях, реализованных на переменных y и z.
  7. Сохраняй эту информацию соответствующий в неударе в лунку.
  8. Второй раз, который нажимает кнопку, функцию sumar() он работает снова, стоимость valor1 в valor5, согласно процедуре наверху, у них будет стоимость предыдущего вычисления, следовательно, valor2 и valor4 у них будет правильные данные и переменная f у него будет ожидаемый результат.

Чтобы исправлять ошибку, тогда, измените эту линию кода:

f = parseFloat(valor2)+parseFloat(valor4);

из-за этой другой

f = parseFloat(x)+parseFloat(z);
1
ответ дан 24.11.2019, 14:44
  • 1
    Большое спасибо из-за твоего ответа и из-за того, что оставляет мне хорошо в просвете использование каждой вещи и все то, что он делает, Спасибо. – Eduardo Javier Maldonado 14.03.2016, 22:16