2011-09-15 21 views
7

Ho un sito ASP.NET in esecuzione localmente sul mio sistema XP utilizzando IIS Express. Esiste una versione live del sito in esecuzione su un server Windows."document.formName" non è definito?

Nelle pagine Web, spesso il Javascript farà riferimento a un modulo sulla pagina utilizzando lo stile document.formName, dove formName è il nome del modulo. Per quanto ne so, questo è un metodo cross-browser, insieme a document.forms.formName e document.forms[0] e così via.

Sul mio sito di sviluppo locale, gli errori di riferimento document.frm1 (noto, cattiva pratica di denominazione); non è definito. D'altra parte, document.forms.frm1 funziona bene. Stranamente, questo non si verifica sul server, sebbene entrambe le pagine siano identiche per quanto riguarda il codice. Ho ricontrollato Firebug e IE8 e Firefox 6.

Un'altra parte strana: il controllo con Firebug, document.frm1 non è definito, ma document.frmClose (un altro modulo) esiste! Eh ?!

Chiunque abbia provato questo prima?

+0

il motivo per cui tutto questo dolore quando si può essere cross browser e cross-platform in un lampo con JQuery? ad esempio: $ ('# myForm') dovrebbe darti il ​​modulo ... in tutti i browser. –

+0

Potremmo vedere l'HTML? ... Sembra che tu abbia un codice HTML non valido. –

+1

@Davide Piras - suggerisci di aggiungere decine di migliaia di righe di javascript (jQuery) solo per fare ciò che già "document.getElementById" fa? Aggiungendo ciecamente una struttura al progetto solo per le parti che duplicano la funzionalità standard è considerato dannoso. –

risposta

12

EDIT 1

ho fatto alcuni esperimenti, e ha scoperto che la proprietà id viene utilizzata per document.forms, mentre la proprietà name sembra essere usato per document.formName

http://jsfiddle.net/GVjsv/


Risposta originale

Assicurarsi che il tuo javascript non sia in esecuzione prima che il DOM sia pronto. Un modo per aiutare è quello di mettere il javascript in fondo alla pagina, o se si sta utilizzando un framework essere sicuri di inserire il codice in una funzione ready tipo:

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

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

Vanilla javascript:

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

la ragione per cui questo non è coerente tra i server potrebbe essere che il server di sviluppo locale carica la pagina più velocemente di quanto il vivo SE rver fa. Il tempismo si risolve in modo che di solito non ottengano lo stesso errore in entrambi i punti - l'enfasi viene aggiunta perché se hai provato abbastanza volte, probabilmente sarai in grado di riprodurre l'errore in entrambe le posizioni.

+0

L'unica cosa è che, anche se si verificava un errore perché il DOM non è pronto, sono entrato in Firebug dopo che la pagina è stata caricata, e 'document.frm1' non era ancora definito, mentre' document.forms.frm1' funzionava. L'errore Javascript avrebbe impedito il caricamento completo del DOM? – voithos

+0

Controlla la modifica, fammi sapere se frm1 ha sia la proprietà 'ID' e' NAME'. Come vedi in jsFiddle, se la proprietà name è omessa allora 'document.formName' non funzionerà. –

+0

Grazie per quello. Questo è un comportamento interessante. Tuttavia, in effetti, sono impostati sia i valori di 'id' che di' name'. Farò qualche esperimento sul server, per vedere se riesco in qualche modo a riprodurre l'errore. C'è davvero ** nessuna differenza nel codice. È identico sul server e localmente. Il server non ha errori. – voithos

3

Si consiglia di non utilizzare l'attributo nome per scopi di identificazione JavaScript. Invece, fornire l'id elemento e utilizzare

document.getElementById("elementId"); 

ad es.

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

old fashion JavaScript, JQuery o altre librerie JS cross browser sono utili e gratuite e disponibili :) –

+3

Alcune delle cose più stravaganti (getElementsByClassname, ecc.) Potrebbero non funzionare in tutti i browser, ma getElementById funziona in tutti i principali browser AFAIK. Amo jQuery ... quando è necessario. Ma non è sempre necessario, e il minuto che mi serve per cercare l'URL della versione ospitata da google o scaricare il mio codice è un minuto che interrompo il mio flusso quando sono nella 'zona'. Per non parlare di aggiungere peso a una pagina quando non è necessaria. – Asmor

+0

corretti, scusa se ho suonato un po 'l'insegnante cattiva ;-) –

6

per ottenere il nome attributo aggiunto al tuo modulo elemento è necessario aggiungere ...

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

... al tuo web.config

+0

Grazie, questo lo ha fatto per me. Avevo un sito esistente con qualche vecchio javascript che utilizzava document.Form1.someTextField.value. E ha smesso di funzionare dopo aver ripristinato il file web.config. –

0

La soluzione migliore per questo è qui sotto:
Basta aggiungere un alloggio nome nel tag form


Se si utilizza il codice sottostante

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

Quello che è necessario eseguire è:
add "nome" proprietà nel tag form come qui di seguito

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