2011-09-15 39 views
7

Tengo un sitio ASP.NET ejecutándose localmente en mi sistema XP utilizando IIS Express. Hay una versión en vivo del sitio ejecutándose en un servidor de Windows."document.formName" no está definido?

En las páginas web, a menudo el Javascript hará referencia a un formulario en la página utilizando el estilo document.formName, donde formName es el nombre del formulario. Hasta donde yo sé, este es un método de navegador cruzado, junto con document.forms.formName y document.forms[0] y así sucesivamente.

En mi sitio de desarrollo local, la referencia document.frm1 (sé, mala práctica de nomenclatura) errores; no está definido Por otro lado, document.forms.frm1 funciona bien. Curiosamente, esto no ocurre en el servidor, aunque ambas páginas son idénticas en lo que respecta al código. He comprobado dos veces con Firebug, y en IE8 y Firefox 6.

Otra parte extraña: consultar con Firebug, document.frm1 no está definido, pero document.frmClose (otra forma) existe! ¿Huh?

¿Alguien ha experimentado esto antes?

+0

por qué todo este dolor cuando puede ser cruzada navegador y multiplataforma en un flash utilizando JQuery? por ejemplo: $ ('# myForm') debería darle el formulario ... en todos los navegadores. –

+0

¿Podríamos ver el HTML? ... Parece que tiene algún código HTML no válido. –

+1

@Davide Piras: ¿sugieres que agregue decenas de miles de líneas de javascript (jQuery) solo para hacer lo que hace 'document.getElementById'? A ciegas, agregar un marco a su proyecto solo para las partes que duplican la funcionalidad estándar se considera dañino. –

Respuesta

12

EDIT 1

lo hice un poco de experimentación, y se encontró que la propiedad id se utiliza para document.forms, mientras que la propiedad name parece ser utilizado para document.formName

http://jsfiddle.net/GVjsv/


Original Answer

Asegúrate de que tu javascript no se esté ejecutando antes de que DOM esté listo. Una forma de ayudar es poner su javascript en la parte inferior de la página, o si está utilizando un marco asegúrese de envolver el código en una función de tipo ready:

jQuery: http://api.jquery.com/ready/

Mootools: http://mootools.net/docs/core/Utilities/DomReady

vainilla javascript:

window.onload = function() { 
    // Code to be run. 
} 

la razón de que esto es inconsistente entre los servidores podría ser que el servidor de desarrollo local carga la página más rápidamente que el vivo se Rver lo hace. El cronometraje funciona para que generalmente no obtengan el mismo error en ambos lugares: se agrega el énfasis porque si probaba suficientes veces, probablemente podría reproducir el error en ambos lugares.

+0

Lo único es que, incluso si fue un error porque el DOM no está listo, entré con Firebug después de que la página terminara de cargarse, y 'document.frm1' aún no estaba definido, mientras' document.forms.frm1' funcionaba. ¿El error de Javascript evitaría que el DOM se cargue por completo? – voithos

+0

Echa un vistazo a la edición, avísame si frm1 tiene una propiedad 'ID' y' NAME'. Como puede ver en jsFiddle, si se omite la propiedad del nombre, 'document.formName' no funcionará. –

+0

Gracias por eso. Ese es un comportamiento interesante. Sin embargo, de hecho, se configuran los valores 'id' y' name'. Haré algo de experimentación en el servidor, para ver si puedo reproducir el error de alguna manera. Realmente hay ** no ** diferencia en el código. Es idéntico en el servidor y localmente. El servidor simplemente no tiene errores. – voithos

3

Recomiendo no usar el atributo de nombre para propósitos de identificación de JavaScript. En su lugar, déle al elemento un id y use

document.getElementById("elementId"); 

p.

<form id="form1"></form> 
<script> 
    var form = document.getElementById("form1"); 
</script> 
+0

JavaScript antiguo, JQuery u otro navegador cruzado Las bibliotecas JS son útiles, gratuitas y están disponibles :) –

+3

Algunas de las cosas más elegantes (getElementsByClassname, etc.) pueden no funcionar en todos los navegadores, pero getElementById funciona en todos los principales navegadores AFAIK. Amo jQuery ... cuando es necesario. Pero no siempre es necesario, y el minuto que me lleva buscar la URL de la versión alojada en google o descargar mi código es un minuto en el que estoy interrumpiendo mi flujo cuando estoy en la 'zona'. Por no hablar de agregar peso a una página cuando no es necesaria. – Asmor

+0

correcto, lo siento si soné un poco el mal profesor ;-) –

6

para obtener el nombre atributo añadido a su forma elemento es necesario agregar ...

<system.web> 
    <pages controlRenderingCompatibilityVersion="3.5" /> <!-- http://www.asp.net/whitepapers/aspnet4/breaking-changes --> 
</system.web> 

... a su web.config

+0

Gracias, esto lo hizo por mí. Tenía un sitio existente con algún javascript antiguo que usaba document.Form1.someTextField.value. Y dejó de funcionar después de que revierte el archivo web.config. –

0

La mejor solución para esto es a continuación:
Sólo añadir un alojamiento nombre en código de formulario


Si está usando el código siguiente

<form id="form1"></form> 
<script> 
    var form = document.form1; //getting undefined error here 
</script> 

Lo que hay que realizar aquí es:
complemento propiedad "nombre" en la etiqueta de formulario, como a continuación

<form id="form1" name="form1"></form> 
<script> 
var form = document.form1; //Now it will work fine and provide the correct value 
</script>