Foros del Web » Programando para Internet » Javascript »

is not a function

Estas en el tema de is not a function en el foro de Javascript en Foros del Web. Hola, queria comentar el siguiente problema a ver si a alguien le pasa... Cuando creo una función en javascript, ejemplo Código: function hola() { $a="hola..."; ...
  #1 (permalink)  
Antiguo 25/11/2009, 09:10
 
Fecha de Ingreso: septiembre-2007
Mensajes: 55
Antigüedad: 16 años, 7 meses
Puntos: 0
Desacuerdo is not a function

Hola, queria comentar el siguiente problema a ver si a alguien le pasa...

Cuando creo una función en javascript, ejemplo

Código:
function hola()
{
$a="hola...";

document.write($a);
}
cuando llamo a la funcion de cualquier pagina html o php, cuando la quiero ejecutar, me tira el error de "hola() is not a function"... le cambio el nombre dejandola como "holaa()" y anda barbaro... pero toooodas las funciones me hacen lo mismo, si le pongo el nombre original no funcionan, les agrego o quito una letra y andan barbaro...

Comenten si sabes porque o si les pasa lo mismo...

Saludos.
  #2 (permalink)  
Antiguo 25/11/2009, 09:53
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: is not a function

hay que ver el codigo de una forma mas completa porque la verdad, al menos yo, poco entiendo tu dilema. lo que puedo ver o entender es que parte de la funcion es construida desde php. para poder indicarte exactamente el problema tienes que mostrar el contenido generado, o sea, lo que el navegador finalmente ve. de acuerdo al error que has indicado, lo mas comun es que has sobreescrito el identificador con otro tipo de valor. o sea, las funciones tambien son como variables y puede que estes nombrando otra variable, al mismo nivel que la funcion (probablemente global), con el mismo nombre asignado a la funcion. para que se entienda,
Código:
function hola(){
...;
}

hola = "string";
hola(); // genera error porque has sobre escrito el identificador;
// javascript considera la funcion hola como una variable aunque no este declarada como tal;
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 26/11/2009, 07:32
 
Fecha de Ingreso: septiembre-2007
Mensajes: 55
Antigüedad: 16 años, 7 meses
Puntos: 0
Respuesta: is not a function

Explico un poco mejor la cuestion y con ejemplos reales...

funcion javascript en archivo "functions.js":

Código:
function alta_cul()
{
    $cul_des=document.alta_cul.cul_des.value;
    $tipo_cul_id=document.alta_cul.tipo_cul_id.value;
    
    if($cul_des=="" || isNaN($cul_des)==false)
    {
        alert("Debe una descripción de cultivo válida.");
        document.alta_cul.cul_des.focus();
        return 0;
    }else{
        if($tipo_cul_id==0)
        {
            alert("Debe una seleccionar un tipo de cultivo válido.");
            document.alta_cul.tipo_cul_id.focus();
            return 0;
        }else{
            document.alta_cul.submit();
        }
    }
}
Llamada a la función desde el html que incluye el "functions.js":

Código:
<form name="alta_cul" action="core/cultivos.php" method="post">
    <!-- Aca van todos los campos del formulario... -->
    <!-- Llamo a la funcion "alta_cul();" definida en "functions.js" para validar el form -->
    <input type="button" name="guardar" value="Guardar" onclick="alta_cul();" />
</form>
En un caso como este, cuando ejecuto el sitio, me tira el error de "alta_cul() is not a function."
Pero, cuando le cambio el nombre a "alta_cult()" por ejemplo, agregandole otra letra, en este caso la "t" anda ... obviamente, el nombre lo cambio en los dos codigos, el javascript y el html...
Es raro... pero siempre me paso y quiero saber porque? xD
Se que no es mi equipo porque me pasa en casa, el trabajo y la facu... osea que debe ser algo de los refresh o algo de eso que no llega a tomar la funcion creada porque en el cache queda alguna version vieja guardada del functions.js
Propongan sus teorias o experiencias propias...

Gracias por la respuesta, saludos.
  #4 (permalink)  
Antiguo 26/11/2009, 08:32
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: is not a function

Código:
<form name="alta_cul" action="core/cultivos.php" method="post">
    <!-- Aca van todos los campos del formulario... -->
    <!-- Llamo a la funcion "alta_cul();" definida en "functions.js" para validar el form -->
    <input type="button" name="guardar" value="Guardar" onclick="alta_cul();" />
</form>
en rojo esta marcado el error. intenta hacer un alert de la "funcion" en el evento onclick y te sorprenderas al ver que en lugar de mostrarte la funcion te muestra (dependiendo del navegador) object HTMLFormElement. en otras palabras, alta_cul se convierte en una referencia del formulario en lugar de la funcion, por eso cuando intentas invocarla la consola te dice que no es una funcion.

la razon. se debe al contexto en que se ejecuta el codigo y la resolusion de conflicto de variable o propiedades. es un mecanismo de javascript para buscar identificadores dado en una jerarquia de objetos. en tu caso, debido al contexto donde se invoca la funcion, javascript busca por el identificador alta_cul comenzando desde el elemento que contiene el evento y sube hasta la jerarquia mas alta de los objetos, o sea window. es decir, el viaje que recorre mas o menos es asi input type:button > form name:alta_cul > document > window.

si recapitulamos acerca de la jerarquia de los objetos, document contiene algunas referencia de elementos con atributos name como es el caso de los formularios. entonces, el mecanismo de resolusion de conflictos va buscando entre los objetos si existe alguna propiedad o variable con dicho nombre o identificador. de modo que mas o menos se ilustra de la siguiente forma.
Código:
input type:button -> no existe propiedad alta_cul
form name:alta_cul -> no existe propiedad alta_cul
document -> existe la propiedad alta_cul, de aqui javascript toma el valor que representa el identificador alta_cul.
¿como se puede solucionar? unas de las formas ya la conoces, cambiando el nombre de la funcion o el valor asignado al atributo name del formulario. por eso siempre es aconsejable nunca utilizar identificadores reservados de javascript o ya asignado en HTML.

la otra alternativa es preceder el nombre de la funcion, o propiedad segun sea el caso, con el objeto que almacena dicha funcion. o sea, la mayoria de las cosas que escribimos en javascript (variables, funciones, objetos, etc) las retiene la jerarquia mas alta de objetos (window). por tanto, puedes invocar la funcion de la siguiente manera.
Código:
<input ... onclick="self.alta_cul();" />
// self es sinonimo de window;
otra forma seria declarar el evento desde javascript pero para que sea posible es necesario que el navegador analice el elemento en cuestion antes de declarar el evento. en tu caso podria ser algo como,
Código:
self.onload = function(){
document.alta_cul.guardar.onclick = alta_cul;
}
quizas el ejemplo anterior te llevara a pensar que volvera a ocurrir el mismo conflicto pero no es asi, se debe al contexto en que se interpreta el codigo javascirpt.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 26/11/2009 a las 08:37
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 21:39.