Newsgroup: it.comp.lang.javascript
Titolo: Caricare CSS dinamicamente [un parere]

 Salve a tutti ho la necessita' di aggiungere dinamicamente dei fogli
di stile, dopo un po' di esperimenti sono arrivato a questo:
http://www.rafb.net/paste/results/UpnMTN80.html
secondo voi va bene cosi', ci sono incompatibilita'
e' possibile migliorarlo ... cose così va ...
grazie in anticipo
--
Legge dei Preliminari:
	Non sono sufficienti quando ci metti piu' tempo a farti la barba
	che a farti la Barbara.
		-- Andrea `Zuse' Balestrero

 e' possibile migliorarlo ... cose così va ...
Dipende: ti interessa anche supportare NS4, oppure no? Perché da un lato,
sembra di sì (document.layers) da un altro, sembra di no (fai uso di DOM
API successivamente alla funzione).
In ogni caso, sei sicuro che la tecnica dello styleswitcher non possa far
al caso tuo?
-- 
ZER0
~ "Lord Pando è il mio orsacchiotto di pezza.
Si veste di nero, si fa dei tatuaggi in faccia e dice
che è passato al Lato Oscuro, ma secondo me è solo l'adolescenza!"


grazie ancora 
buona giornata


Se non ti interessa "l'alternanza" (lo switching di cui sopra) puoi provare
anche a fare a meno di creare "n" tag link; e aggiungere direttamente la
rule "import" in uno stylesheet già presente.
-- 
var SEI	= "1+5", NOVE = "8+1";
// dump TheAnswerToLifeTheUniverseAndEverything :
alert("Cosa ottieni moltiplicando "+
	eval(SEI)+" per "+eval(NOVE)+"? "+(eval(SEI+"*"+NOVE));

?
grazie
nella seconda versione
-- 
A parlaa maa se fa maa, ma se induvina.
		-- Antico proverbio della Brianza

?
Di questa stavo parlando, quando ti ho detto "Se non ti interessa
l'alternanza (..) puoi provare a fare a meno di creare 'n' tag link".
Non l'ho "testato", ho solo verificato l'approccio che hai usato.
Ora che mi ci hai fatto riposare l'occhio, temo che questa riga:
lastLink.insertBefore(cssLink, cssLink.nextSibling);
Sia, a livello di logica, errata.
Per prima cosa, sembra che tu voglia inserire il nuovo tag creato "prima"
di qualche altro tag, il che non è corretto. Dato che vai in "aggiunta", i
css che carichi devono essere cronologicamente in sequenza (il più vecchio
come primo, il più recente come ultimo, dall'alto verso il basso).
Inoltre, il secondo parametro ho paura che sia sempre "null", dato che
cssLink non fa ancora parte del DT, non ha relazioni con altri nodi.
Paradossalmente, questo tuo secondo errore di logica corregge il primo, in
quanto un insertBefore con null come secondo parametro diventa un
"appendChild" :)
C'è anche un terzo errore, ovvero il parentNode. "lastLink" in realtà è
errato. Risulta corretto solo se non vi sono già dei tag link presenti.
Altrimenti temo che "tenterebbe" di inserire il tuo nuovo tag link come
figlio dell'ultimo tag link inserito. Devi aggiungere sempre i tag link
come figli di head. Quindi elimina tutta la parte relativa al "links" e
"lastLink" inserendo sempre come parentNode "head".


 
 questo e' proprio un erroraccio, grazie usero' sempre head invece di
fare un inutile controllo ...
grazie tante per la risposta e la disponibilita' ...
-- 
- Quando e' legale colpire un carabiniere sulla testa?
- Quando hai una pompa per rigonfiarla.
		-- Da it.hobby.umorismo

/**
  versione riveduta senza controllo dell'esistenza dei link ...
*/
function loadCss(cssfile) {
    var headElem = document.getElementsByTagName('head')[0]
    var cssLink = document.createElement('link');
    cssLink.rel  = 'stylesheet';
    cssLink.href = cssfile;
    cssLink.type = 'text/css';
    headElem.insertBefore(cssLink, cssLink.nextSibling);
}
magari serve a qualcuno
-- 
Buona notte, e sogni d'orco.
		-- Andrea `Zuse' Balestrero, "Piccoli feti crescono"

  questo e' proprio un erroraccio, 
Anche i precedenti due, solo che non hanno un impatto devastante a livello
pratico, nella maggior parte delle implementazioni delle DOM API nei
browser.


     headElem.insertBefore(cssLink, cssLink.nextSibling);
Oltre che a correggere quest'ultima riga come ti ho indicato nell'altro
post; io cambierei il nome, perché in verità non è che "carica" un css :) 
Inoltre, potresti trasformarlo in metodo di classe in questo modo se
inserisci più css, l' "headElem" lo recuperi una volta sola.
L'alternativa con il document.write:
function loadCss(cssfile){
	document.open("text/html");
	documente.write("<link rel=\"stylesheet\" type=\"text/css\"
href=\""+cssfile+"\" />");
	document.close(); // flush


 
si ma cosi' il dom inspector non mi fa vedere il tag link aggiunto
dinamicamente e non voglio sia cosi' ...
grazie ancora per la disponibilita' ....
-- 
- Che ora e'?
- Non lo so, continua a cambiare...

 grazie ancora per la disponibilita' ....
De nada.


 trovare tali workaround.
(per il dom inspector era un problema di cache)
  il sistema carica un template personalizzato, per il cliente, che
risiede in templates/ in questo template c'e' il riferimento al
foglio di stile **principale** ed il js **principale** (in cui inseriro'
tra le altre anche la funzione loadCss)
  una volta definito il template il sistema si occupa di //copiare le
directory dei singoli pacchetti necessari al cliente// nella directory
p/ ed il `pannello di controllo` e' pronto.
 il workaround e' necessario poiche' se il cliente dopo un paio di
giorni mi dice: `voglio anche il pacchetto per la gestione UnoIcsDue`
io (o chi per me) prendo la directory la copio in ftp e sono a posto
(il menu viene generato dinamicamente)
 ogni pacchetto quindi deve essere utilizzabile standalone
se anche non dovesse funzionare il javascript principale e quindi il
css, il problema non mi tange perche' tutti gli script utilizzati
vengono inclusi direttamente dal pacchetto, si vedrebbe solo `meno
colorato` ma sara' perfettamente utilizzabile (gli script in ogni caso
sono di contorno alla pagina e non implementano nessuna funzione
indispensabile)
grazie ancora
per me il thread e' chiuso
-- 
"Cosa si puo' regalare ad un uomo che ha gia' tutto?", chiese la giovane
	ragazza alla madre.
"Incoraggiamento, cara", rispose lei.

 indispensabile)
Appunto non dovrebbe essere necessario un workaround del genere.
Un sistema di templating dovrebbe funzionare esattamente cosě, ma in modo
piů trasparente. Non dovrei essere io, tramite js, a dover dire di caricare
tale css o js facente parte del modulo; dovrebbe essere l'engine a farlo
autonomamente nel momento in cui aggiungo il modulo stesso.
Se devi imbastire dei workaround del genere, significa che c'č qualcosa che
non va nella struttura di base del templating engine.


 autonomamente nel momento in cui aggiungo il modulo stesso.
  personalmente ritengo che tenere codice pulito e separato dall'output
che si produce comporti innumerevoli vantaggi;
  tutti i miei script di visualizzazione dati fanno 6 operazioni:
   * effettuano una query ad un database
   * applicano eventuali filtri pre assegnazione
   * caricano file template
   * elaborano il risultato della query
   * applicano eventuali filtri post assegnazione
   * stampano a video il risultato dell'elaborazione
  raramente supero le 10 righe di codice per ogni
script e sono felice :)
grazie per i consigli


   personalmente ritengo che tenere codice pulito e separato dall'output
Esattamente. Ed č esattamente ciň che il sistema di templating da te
descritto in precedenza *NON* fa.
Se noti, invece, č nella descrizione che ti ho fatto che raggiungi la
separazione.
Un templating engine che necessiti di workaround del genere indica una
grave lacuna nel sistema.
La funzione "loadCss" č esattamente l'opposto della logica di separazione;
produce il classico "spaghetti-code" e *non* permette la separazione delle
parti.
-- 
.ZER0//sign
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)


css e javascript sono parte integrante dell'html [1]:
* il tipo di output che deve produrre il sistema e' html,
* javascript fa parte di html
* (di conseguenza) eventuale codice javascript **deve** essere contenuto
  nel file html
* posso modificare il mio template di output conoscendo solamente html e
  javascript
* posso visualizzare i miei template su un normale client con un browser
* varie ed eventuali
* .....
  perche' devo essere costretto a farmi caricare il
javascript da qualcun'altro quando sono benissimo in grado di
essere indipendente e poter spostare quel template dove voglio senza
preoccuparmi di andare a cambiare una linea di php?
 perche' dovrei fare cio' quando il `qualcun altro` non farebbe che
scrivere codice html?
 perche' rinunciare all'indipendenza ed alla portabilita' del template?
per me il thread e' chiuso ( ... e siamo a tre ... :) )
[1] voglio poter essere in grado di accedere tramite portatile lynx e
    gsm  senza sorbirmi abbellimenti inutili (l'immaginetta di sfondo
    etc.)
-- 
ANTEFATTO - Colui che un tempo si drogava, ma ora non piu'

 per me il thread e' chiuso ( ... e siamo a tre ... :) )
Non funziona così un NG. :) Un thread non è chiuso perché uno dei
partecipanti lo decide. Se uno ha esaurito le argomentazioni, o ha detto
ciò che doveva dire, allora semplicemente smette di alimentare il thread.
Ne più ne meno.
Da parte mia cerco solo di spiegarti il perché, se un templating engine
necessita di una "toppa" così vistosa, ha decisamente qualcosa che non va.
Spero a questo giro di esserci riuscito. ;)
O, quanto meno, da averti spinto ad approfondire l'applicazione del MVC
alle pagine web; della separazione del codice che il w3c sta promuovendo da
tempo.


 [...] l'applicazione del MVC alle pagine web; 
  (forse) ho capito perche' non ci capiamo :) ... il mio punto di vista
di  `applicazioni basate su interfaccia web` e' basato sulle
caratteristiche del protocollo http.
  ogni pagina e' stateless a livello client.
  non produco pagine web che scatenano eventi, scatenano
**nuove** richieste al server (che potrebbero essere scatenate da
chissa' chi)
  nel momento in cui finisco di stampare a
video la pagina, devo solamente rimanere in attesa di ricevere
**nuovamente** i dati elaborarli e stampare un'altra pagina di
conferma / errore / etc.
  probabilmente (penso sia cosi') per te una pagina html
e' qualcosa di diverso ... sarei felice di sapere cos'e'?
  PS
  per me il thread e' chiuso ;)
  PS2 Sony (tm)
  per il thread e' chiuso : "Espressione solitamente utilizzata  qualora
uno dei partecipanti ad una discussione si rendesse improvvisamente
conto di poter continuare a parlare di un'argomento all'infinito, forte
di convizioni radicate rispetto a quelle (opposte) dei suoi
interlocutori" ;)
  buona giornata (per me sara' lunga lunga lunga ...)
-- 
Un carabiniere mi ferma, mi chiede i documenti, legge "Paolo Rossi", si
gira verso di me e chiede: "Ah, lei e' il fratello?".
		-- Paolo Rossi

   buona giornata (per me sara' lunga lunga lunga ...)
Altrettanto :) Per me, invece, oggi sarà molto breve ^_^
-- 
var SEI	= "1+5", NOVE = "8+1";
// dump TheAnswerToLifeTheUniverseAndEverything :
alert("Cosa ottieni moltiplicando "+
	eval(SEI)+" per "+eval(NOVE)+"? "+eval(SEI+"*"+NOVE));

 per me il  e' tutto chiaro ... :)
 sono uno sviluppatore php (come hai intuito) che dopo una
esperienza di studio sui css (il problema non mi ha mai toccato
personalmente se ne sono occupate e se ne occupano attualmente altre
persone) e dopo aver visto i vari `giochetti`[1] su siti come alistapart
ho dato uno sguardo piu' approfondito a come si possa modificare il DOM
tramite javascript ed ho voluto fare questo esperimento ...
(a proposito .. ti sarai accorto anche tu che siamo OT da parecchio ..)
 implementare la funzionalita' di caricamento automatico css e
javascript dalla directory del package, e' un lavoro da tre secondi (per
 come e' strutturato il sistema) basta un glob ...
 dal mio punto di vista una pagina html **non** ha un **comportamento**:
ha solamente una serie di link e pulsanti che generano nuove richieste
al server;
 che //comportamento// puo' avere una pagina che **cessa di esistere**
nel momento in cui si verifica un **evento**?
 se stessimo parlando di applicazioni //client-side// sarei il primo a
darti ragione.
 ma sul web non riesco a concepire una pagina html che abbia un
`comportamento` ...
 siamo OT se ti va possiamo continuare in privato ...
sono sempre interessato ai **nuovi** spunti
[1] sono consapevole che il javascript non serve solo per gli
    `effetti speciali` ma, a saperlo usare, si possono fare cose
    grandiose (htmlarea in testa)
    da profano ho realizzato una (misera) chat usando jpspan
 
http://jpspan.sourceforge.net/wiki/doku.php
alla prossima
-- 
"Mouse non trovato.  Cliccare su un tasto del mouse per continuare."
		-- Windows 95

 sono sempre interessato ai **nuovi** spunti
Beh, in verità non sono propriamente nuovi. Molti si stupiscono di vedere
da quanti anni è che il 
w3.org
 sta "spingendo" questa filosofia, che -
sfortunatamente - è stata adottata dai più solamente recentemente.
Credo che la "colpa" sia da addossare alla natura stessa del web: in quanto
tecnologia aperta, la stragrande maggioranza impara "copiando" ciò che
fanno gli altri, nei rispettivi siti. Quindi ne assumono anche la medesima
"impostazione". E solo una piccola parte di questi si chiede "se c'è
dell'altro", e si butta a capofitto a documentarsi sui siti ufficiali e
non; per poi sperimentare per proprio conto. Ma qui il discorso diventa
complesso e, in effetti, OT.
(Nota: Non vorrei fraintendessi, quest'ultimo discorso è ampiamente
generale, non mi sto affatto riferendo a te, anzi)



  le mie perplessita' su considerare javascript qualcosa di diverso da
quello che e' credo derivi dalla non comprensione delle potenzialita'
che ha javascript (anche se l'ho usato, male, con jpspan)
  ho ridato un' occhiata al codice di quella applicazione
e questo articolo mi sta' aprendo gli occhi:
http://www.onlinetools.org/articles/unobtrusivejavascript/
  se mi dai qualche link per partire dalle **basi**  ... grazie
(ti prego pero' niente 'hello world' con alert :))
i link vanno bene anche cartacei in lingua originale ;)
buon pranzo da un sud sempre piu' `rovente`
(... mi aspettano un po' di log da controllare ed un paio di whois da
fare ... ;))
--
Bimbo uccide entrambi i genitori per partecipare alla gita degli orfani.

 buon pranzo da un sud sempre piu' `rovente`
Anche qua non si scherza.. meno male che ieri si è rabbuiato un po' e ha
fatto due gocce.. si è un poco rinfrescato, ma niente di che.
E poi sarà tre giorni che ho un mal di testa fetente..


 fatto due gocce.. si č un poco rinfrescato, ma niente di che.
Beh, perň ieri sera in giro era un gran figata, a dorso nudo avevo quasi
frescolino! (inutile dire che stamattina č come se nulla fosse successo...)
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.