Ver Mensaje Individual
  #4 (permalink)  
Antiguo 26/11/2009, 08:32
Avatar de zerokilled
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