Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problema al llamar función

Estas en el tema de Problema al llamar función en el foro de Javascript en Foros del Web. Tengo un problema, el cual se trata que tengo tres botones los cuales llaman cada uno a una función distinta, dos de ellos funcionan correctamente ...
  #1 (permalink)  
Antiguo 16/01/2015, 16:09
 
Fecha de Ingreso: enero-2015
Ubicación: Gijon
Mensajes: 10
Antigüedad: 5 años, 5 meses
Puntos: 1
Pregunta Problema al llamar función

Tengo un problema, el cual se trata que tengo tres botones los cuales llaman cada uno a una función distinta, dos de ellos funcionan correctamente y llaman a la función cada vez que se pulsan.
El problema radica en el tercero, el cual solo llama a la función la primera vez que pulso el boton, las siguientes veces no llama a la función.

Les dejo el código de la parte conflictiva, si necesitan el codigo completo haganmelo saber.

<HTML>
<head>
<script type="text/javascript">
function impacto()
{
var circunstancia=document.getElementById("circunstanc ia").value
//ataque
var dado=parseFloat(document.getElementById("dado").va lue)
var bonifAtaque=parseFloat(document.getElementById("bo nifAtaque").value)
var otrosBonif=parseFloat(document.getElementById("otr osBonif").value)
//Calculo Circunstancias
if(circunstancia=="Normal")
bonifAtaque=bonifAtaque
if(circunstancia=="Ventaja en combate frente al objetivo")
bonifAtaque=bonifAtaque+2
if(circunstancia=="Atacante tumbado")
bonifAtaque=bonifAtaque-2
if(circunstancia=="Atacante impedido")
bonifAtaque=bonifAtaque-2
if(circunstancia=="Objetivo con cobertura")
bonifAtaque=bonifAtaque-2
if(circunstancia=="Objetivo con cobertura superior")
bonifAtaque=bonifAtaque-5
if(circunstancia=="Objetivo con ocultación (sólo c/c y a distancia)")
bonifAtaque=bonifAtaque-2
if(circunstancia=="Objetivo con ocultación total (sólo c/c y a distancia)")
bonifAtaque=bonifAtaque-5
if(circunstancia=="Distancia larga (sólo ataques con arma)")
bonifAtaque=bonifAtaque-2
if(circunstancia=="Ataque en carga (sólo c/c)")
bonifAtaque=bonifAtaque+1
ataque=dado+bonifAtaque+otrosBonif
//defensa
var CA=parseFloat(document.getElementById("CA").value)
var FORT=parseFloat(document.getElementById("FORT").va lue)
var REF=parseFloat(document.getElementById("REF").valu e)
var VOL=parseFloat(document.getElementById("VOL").valu e)
var bonifdef=parseFloat(document.getElementById("bonif .def").value)
defensa=CA+FORT+REF+VOL+bonifdef
impacto=ataque-defensa
if (impacto>=0)
{
if (dado==20)
document.getElementById("impacto").value="Si (Crit)"
if (dado==1)
document.getElementById("impacto").value="No (Fallo)"
else
document.getElementById("impacto").value="Si "+"("+impacto+")"
}
else{
document.getElementById("impacto").value="No"+"("+ impacto+")"
document.getElementById("daño").value=0
}
}
</script>
</head>
<body>
<fieldset>
<legend>Tirada Ataque</legend>
Circunstancia: <select id="circunstancia">
<option>Normal</option>
<option>Ventaja en combate frente al objetivo</option>
<option>Atacante tumbado</option>
<option>Atacante impedido</option>
<option>Objetivo con cobertura</option>
<option>Objetivo con cobertura superior</option>
<option>Objetivo con ocultación (sólo c/c y a distancia)</option>
<option>Objetivo con ocultación total (sólo c/c y a distancia)</option>
<option>Distancia larga (sólo ataques con arma)</option>
<option>Ataque en carga (sólo c/c)</option>
</select>

<table>

<tr><td>
<fieldset><legend>Atacante</legend>
Dado: <input type="text" id="dado" size="1/4" value="0">
Bonif.Ataque: <input type="text" id="bonifAtaque" size="1/4" value="0">
Otros bonificadores: <input type="text" id="otrosBonif" size="1/4" value="0"
</fieldset></td><td>
<fieldset><legend>Defensor</legend>
CA: <input type="text" id="CA" size="1/4" value="0">
FORT: <input type="text" id="FORT" size="1/4" value="0">
REF: <input type="text" id="REF" size="1/4" value="0">
VOL: <input type="text" id="VOL" size="1/4" value="0">
Otros Bonificadores: <input type="text" id="bonif.def" size="1/4" value="0">
</fieldset></td></table><br>
Impacto: <input type="text" id="impacto" size="4" readonly> <button onclick="impacto()">Calcular</button>
</body>
</HTML>
  #2 (permalink)  
Antiguo 16/01/2015, 18:38
 
Fecha de Ingreso: enero-2015
Mensajes: 1
Antigüedad: 5 años, 5 meses
Puntos: 1
Respuesta: Problema al llamar función

Muy bien, si no estoy tan perdido, (ojo, que llevo varios meses sin tocar Javascript) el problema (ya que no especificaste qué tipo de problema te daba, solamente dijiste que la función no se volvía a llamar) se da porque estás sobreescribiendo el valor de la variable en la cual está tu función impacto()


El error




Recordar que cuando se crea una función al estilo :
Código Javascript:
Ver original
  1. function soyUnaFuncion(){
  2.     //algo de código
  3. }

Se está creando un "función global". Lo cual significa que this contendrá una referencia al objeto window.

Pero lo divertido no es eso, si no que, aparte de eso, Javascript crea una variable global con el mismo nombre que la función. O sea, terminas teniendo una variable impacto la cual hace referencia a la función impacto()


Pero hasta ahí todo bien, no pasa nada. ¿Entonces cuál es el problema?


Esto


En una parte de tu código dentro de la función impacto() estás creando una variable llamada impacto.

Pero vamos, ¿que acaso eso no sería una variable local?

No realmente

Cuando declaras una variable en Javascript sin var, éste asume que estás creando (o en este caso, sobreescribiendo) una variable global. Caso contrario hubiera sido si hubieras declarado la variable usando var

Código Javascript:
Ver original
  1. var impacto = ataque - defensa;

De esa manera no estarías ocasionando ningún problema ni sobreescribiendo nada, ya que crearías una variable local


¿La solución?
  1. Usa var antes de la variable impacto dentro de tu función impacto()
  2. Coloca otro nombre a tu función


Espero haber ayudado
  #3 (permalink)  
Antiguo 17/01/2015, 04:10
 
Fecha de Ingreso: enero-2015
Ubicación: Gijon
Mensajes: 10
Antigüedad: 5 años, 5 meses
Puntos: 1
Respuesta: Problema al llamar función

Cambie el nombre de la función como me dijiste y ahora funciona perfectamente; te agradezco también que me explicaras el porqué del error ya que ahora cuidare de no cometerlo mas veces.

Etiquetas: html, html+javascript
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:20.