8 messaggi dal 03 febbraio 2011
Ciao a tutti, difficile spiegarlo in poche parole nel titolo...
ho due pagine in cui lo stesso javascript si comporta in maniera diversa:

nella prima pagina javascript:

function setFocus(ctrl) {
document.all(ctrl).focus();
return false;
}

controllo: <asp:TextBox CssClass="colorato" runat="server" ID="txtLogin" Width="96px" />

e chiamata: <script type="text/javascript"> setFocus('txtLogin'); </script>

mi funziona perfetto e mi mette il focus sulla txt per immettere il login.

nella seconda pagina javascript:

function cambiaStato(msg) {
document.all('txtStato').value = msg;
}

controllo: <asp:TextBox CssClass="colorato" runat="server" ID="txtStato" />

e chiamata: <asp:TextBox onchange="javascript: cambiaStato(1);" runat="server" ID="txtQListone" Text='<%# Eval("quantita") %>' TabIndex='<%# TabI++ %>' />

ecco, nella seconda pagina praticamente vorrei che quando cambio qualcosa nel campo "txtQListone" mi mette a 1 l'input txtStato, in modo tale so se sono state modificate le voci del datalist "Listone" e allora effettuo un salvataggio altrimento lo lascio evito.

Fatto sta che se il primo js mi funziona bene, il secondo mi dice
'document.all(...)' è nullo o non è un oggetto.

come è possibile? ok è diversa l'utilità finale però la parte che mi va in errore è identica.
Può essere perchè la prima è in una pagina normale mentre la seconda è un ContentPlaceHolder dipendente da una Master.page? mi sembrerebbe strano :(

grazie mille per qualsiasi aiuto!
gnecco ha scritto:
Può essere perchè la prima è in una pagina normale mentre la seconda è un ContentPlaceHolder dipendente da una Master.page? mi sembrerebbe strano :(

Nulla di strano, è perfettamente normale. Se osservi l'HTML generato vedi che l'ID della textbox inserita nella master page avrà come prefisso il content placeholder: "YourContentPlaceHolderId_YourControlId".
Per risolvere devi passare alla funzione javascript la proprietà ClientID del controllo.
Se usi il FX 4.0 puoi controllare la modalità di generazione dell'ID lato client http://www.aspitalia.com/script/1018/Gestione-ID-Lato-Client-ASP.NET-4.0.aspx
HTH

PS: document.all??? Naaaaaaa!

Matteo Casati
GURU4.net
8 messaggi dal 03 febbraio 2011
Purtroppo sto usando la 3.5 e non ho ancora guardato nulla della 4.0 e, esssendo un lavro di circa 300 pagine aspx, non mi fido a cambiare versione.

In ogni caso grazie alla dritta ho risolto:

function cambiaStato(msg) {
document.getElementById('ctl00_ContentPlaceHolder1_txtStato').value = msg;
}

cosi funziona perfettamente.
meglio "getElementById" di "all" vero?

grazie mille!
Decisamente meglio. Ma meglio ancora è usare jQuery
Una nota: evita di cablare nel javascript l'ID generato; se modifichi la gerarchia dei controlli (master/nested master, page, controls, ecc.), cosa che spesso durante un refactoring succede, lo script smette di funzionare! Lascia invece che sia il controllo stesso ad esporre il suo ID nel DOM, scrivendolo lato server con qualcosa del tipo:
var obj = document.getElementById("<%= MyServerControl.ClientID %>");

Matteo Casati
GURU4.net

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.