Newsgroup: it.comp.lang.javascript
Titolo: Explorer: Come fallire su un codice semplice...

Salve a tutti.
Sinceramente inizio veramente ad averne le p...e piene di Explorer che
supporta male qualsiasi codice standard. O è Firefox ad essere avanti
o lui ad essere molto indietro.
Vi mostro due pezzi di codice che fanno la stessa cosa e che funzionano
permfettamente in Firefox ma no in Explorer. Codice banale tra l'altro:
<head>
  <title></title>
    <script>
       function add_remove (id,str)
          [...]
    </script>
</head>
<body>
  <input type="checkbox" value="Pippo" onclick="add_remove
('del_elenco', this.value)"> Pippo
  <input type="checkbox" value="Pluto" onclick="add_remove
('del_elenco',this.value)"> Pluto
  <table id="del_elenco" border="1" align="center" width="50%"
cellpadding="1" cellspacing="1">
     <tr>
       <td> Stai Eliminando: </td>
     </tr>
  </table>
</body>
</html>
-----------------------------------
Ora le due versioni della funzione.
La prima, quella che ho fatto per prima e che sarebbe migliore se
funzionasse. In Firefox va alla grande; Niente su Exploder:
function add_remove (id,str)
       {
          var obj = document.getElementById (id);
          var child = document.createElement ('tr');
          var child_2 = document.createElement ('td');
          child_2.innerHTML = str;
          child.appendChild (child_2);
          obj.appendChild (child);
       }
La seconda l'ho fatta per vedere se Explorer digerisce maggiormente il
suo innerHTML invece che gli appendChild (come riscotrato da un mio
precedente thread).
function add_remove (id,str)
       {
          var obj = document.getElementById (id);
          str = '<tr><td>' + str + '</td></tr>';
          obj.innerHTML = obj.innerHTML + str;
       }
Ancora una volta FireFox si dimostra capace di farlo. Exploder no.
Io sinceramente non capisco come possa Explorer avere tutti questi
problemi. Possibile che non si riesca a fare un cavolo di script
semplice? 
Dove sta il problema?
Grazie e alla prossima...

 cellpadding="1" cellspacing="1">
Quindi stai aggiungendo tr a una table...
esistono dei metodi apposta per farlo, vedi qua:
 
http://www.w3schools.com/htmldom/dom_obj_tablerow.asp
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

Grazie.
Ho provato le funzioni che dici e sembra funzionare. Però odio quando
mi tocca fare doppio codice.
Comunque la nuova funzione è:
function add_remove (id,str)
       {
          var obj = document.getElementById (id);
          var child = document.createElement ('tr');
          var child_2 = document.createElement ('td');
          if (document.all)
          {
            var row = obj.insertRow();
            var cell = row.insertCell();
            cell.innerHTML = str;
          }
          else
          {
            child_2.innerHTML = str;
            child.appendChild (child_2);
            obj.appendChild (child);
          }
       }
Ciao e alla prossima...

 mi tocca fare doppio codice.
Eggià...in generale IE ha spesso problemi con appenChild e simili. 
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 problemi. 
Il problema č del tuo codice, non del browser: Tu stai cercando di
aggiungere un elemento "TR" ad un elemento "TABLE". Il che non č corretto,
come piů di una volta č stato detto in questa sede (č quasi una faq, direi
:) ).
Gli elementi "padri" di un tag "TR" sono "THEAD", "TFOOT" e "TBODY"; non
"TABLE". L'elemento "TABLE" č il nonno dell'elemento TR.
Se tu ometti nel codice HTML il tag TBODY in una tabella, il browser te lo
aggiunge in fase di parsering.
Prova a farti la stampa dell'innerHTML della tabella, e vedrai.
Quindi il codice corretto sarebbe il seguente:
	var obj = document.getElementById (id);
	.
	.
	obj.tBodies[0].appendChild (child);
Ovviamente sarebbe meglio che tu lo esplicitassi nel codice di markup, il
tbody. Cosě facendo potresti anche assegnare un ID direttamente a lui
invece che al tag TABLE (ammesso e concesso che l'ID sulla tabella ti serva
solo per questo scopo).
-- 
var SEI	= "1+5", NOVE = "8+1";
// dump TheAnswerToLifeTheUniverseAndEverything :
alert("Cosa ottieni moltiplicando "+
	eval(SEI)+" per "+eval(NOVE)+"? "+eval(SEI+"*"+NOVE));

Ammetto che l'errore esisteva e me ne sono accorto anch'io durante
l'estensione della funzione in quanto anche FireFox nel conteggio dei
figli della table, dava solo 1 contando quindi solo il TBODY.
I problemi di exploder comunque persistono. Non è possibile in
Explorer la possibilità di usare una setAttribute per settare classe o
Style. Occorre fare manualmente i settaggi di tutti i parametri
(filosofia che va contro la logica stessa dei CSS).
Riguardo all'errore di cui sopra, ammetto che Explorer era nel giusto,
però da un Browser di casa Microsoft che fa tutto lui, uno si potrebbe
aspettare che faccia quel genere di correzioni al volo. I problemi alla
funzione appendChild rimangono (come sorti da un altro mio topic) ed il
fatto che Micro$oft abbia inventato le funzioni insertCell ed insertRow
dimostra come la M$ voglia sempre fare le cose a modo suo invece che
implementare bene le cose standard.
Ecco comunque il codice nuovo per coloro a cui potrebbe interessare.
Serve per poter aggiungere e togliere del testo da dentro una tabella.
Il testo viene messo in ordine alfabetico. Nel mio caso l'ho usata per
far vedere i valori di un checkbox quando venivano selezionati. L'ID
passato è l'ID della tabella a cui aggiungere le righe.:
function add_row (tbody,stringa)
       {
         var child = document.createElement ('tr');
         var child_2 = document.createElement ('td');
         if (controllo per decidere eventualmente la classe da
applicare)
            var classe = "classe 1";
         else
            var classe = "classe 2";
         if (document.all) //versione Windows
              if (controllo per decidere eventualmente la classe da
applicare)
                 Elenco di tutte le funzioni di stile da applicare
              else
                 Elenco di tutte le funzioni di stile da applicare
         else //versione Firefox
          child_2.setAttribute ("class",classe);
         child_2.innerHTML = stringa;
         child.appendChild (child_2);
         tbody.appendChild (child);
       }
       function add_remove (id,str)
       {
          var obj = document.getElementById (id);
          var stringhe = new Array();
          var tbody = obj.childNodes[0];
          var num_figli = tbody.childNodes.length;
          for (var i=0,j=0; i < num_figli; i++)
          {
             //Creo un vettore con tutte le voci
             if
((tbody.childNodes[i].childNodes[0].innerHTML.indexOf(str)) == -1)
             {
              stringhe[j]=tbody.childNodes[i].childNodes[0].innerHTML;
              j++;
             }
          }
          for (var i=0; i < num_figli; i++)
            tbody.removeChild(tbody.childNodes[0]);
          //Questo controllo mi serve per capire se devo aggiungere o
togliere
          //la voce passata. Se infatti la lunghezza della stringa
ricreata
          //è minore del numero di figli originali, significa che
durante il
          //processo di creazione del vettore strighe, esisteva già
una voce
          //uguale a quella passata ovvero la voce va tolta
          if (stringhe.length == num_figli)
            stringhe[stringhe.length] = str;
          stringhe = stringhe.sort();
          for (var i=0; i < stringhe.length; i++)
            add_row (tbody,stringhe[i]);
       }
Ciao e alla prossima...

 implementare bene le cose standard.
E questa tua frase invece dimostra che è abbastanza facile fare gaffe se
prima non ci si è documentati a dovere sugli standard web ;)
insertCell e insertRow non li ha inventati la Microsoft. Li ha inventati il
w3c. Essi *sono* metodi standard.
l'innerHTML, invece, che tu hai usato nella funzione, non è affatto
standard. Anche se è supportato dai browser attuali.
E' un'estensione introdotta dalla Microsoft. Gli altri, non hanno fatto che
copiarla; visto che era stata richiesta a gran voce dagli sviluppatori
*anche* se non seguiva gli standard.
Stessa cosa dicasi per XmlHttpRequest, o la modalità RichEdit (midas su
Gecko). Tutte cose che ha introdotto la Microsoft nel proprio browser, e
che gli altri hanno poi deciso di copiare.
Io non sono un "fan" della Microsoft. A me IE non piace. Preferirei che
tutti usassero browser come Firefox, o comunque aderenti agli standard.
Ma non ha senso sparare alla cieca su qualcosa. Bisogna essere obiettivi,
riconoscere i meriti e i difetti di ogni prodotto. Quando qualcosa non
funziona, perché IE non segue gli standard o è bacato, sono il primo a
prendersela. Ma lo stesso faccio con Firefox, o con qualsiasi altro
software.
P.S.
Nel tuo codice non hai bisogno di fare discriminanti per "IE o il resto del
mondo", non è necessario duplicare il codice se scrivi secondo gli
standard.
Inoltre, fare il semplice check su document.all per questo genere di cose,
oltre che essere contrario alla buona programmazione, è pericoloso. Opera
insegna.


>>>
Assolutamente no, anzi. Spiegami cosa va contro la filosofia dei CSS.
Non
vedo che problema ci sia a dover scrivere:
obj.className="myclass";
piuttosto che:
obj.setAttribute("class","myclass");
<<<<
Il fatto è che la classe a mio giudizio è un attributo come tutti gli
altri. Allora perché non posso settarlo con una setAttribute? Io la
funzione className non la conoscevo. Non posso conoscere tutte le
funzioni specifiche del mondo. Se ho una funzione generica che fa
questo genere di cose, mi aspetto che funzioni. Si ritorna allo stesso
discorso di insertRow ecc...
Quindi dal mio punto di vista Explorer è un browser che mi sta dando
grossi problemi (per citarne un'altro, il tag fieldset che non funziona
come dovrebbe se gli si applicano degli stili oppure l'inclusione di un
file .js che a volte non mi fa visualizzare nulla a schermo anche se il
codice HTML esiste perfettamente se si guarda il sorgente della
pagina).
Sarà anche la mia inesperienza, non lo metto in dubbio, però Firefox
in qualche modo riesce sempre ad aiutarmi e i miei script funzionano
sempre. Explorer mi costringe invece a lunghe sedute di test e
tentativi. 
Ciao e alla prossima...

 tentativi. 
Ti ripeto, mi sembra di sentire quello che dicevano anni fa le persone di
Netscape 4.x, rispetto a IE.
Solo perchй non avevano studiato le reference.
E, ovviamente, non avevano ragione loro.


Allora.
Io non metto in dubbio la mia inesperienza, e che magari il manuale a
cui mi appoggio quando non ho connessione non sia perfettamente idoneo,
per c'è anche un altro fatto.
Io giudico un software anche dalle sue capacità al di fuori del
"normale". Due automobili rispettano gli standard se hanno quattro
ruote, un motore ed un volante. Però permetti che possa valorizzare
meglio l'auto con il servosterzo? E' un aggiunta, è vero. Una
miglioria che permette di facilitarmi i parcheggi. E' quello che vuoi
ma comunque sia è un "di più" che apprezzo.
Firefox attualmente ha queste aggiunte che mi permettono di preferirlo
a Internet Explorer come anni fa preferivo quest'ultimo a Netscape che
mi ricordo mi costringeva a salti mortali per del semplice HTML.
Io quindi vado un po' contro IE perché è forse troppo vecchio per gli
standard moderni a cui ci abituano gli altri browser e non mi aiuta (e
non aiuta i niubbi) come ci si aspetterebbe. Magari con la versione 7
cambierò idea perché vedrò magari che la createElement non farà
casino; Che i CSS me li prende bene; Che le altezze delle celle saranno
reali e non "preimpostati" come fa lui; Che mi riuscirà usare form in
PHP di upload delle immagini che funzioni perfettamente e tanti altri
problemi riscontrati che non sto ad elencare.
Io posso capire che magari nello specifico caso di Javascript, possa
aver sottovalutato per partito preso il browser di casa Microsoft,
però se ogni volta che ho un problema (non solo con Javascript),
questo succede solo con IE, qualcosa significherà. Non posso sempre
aver torto io abcge perché ammetto che con JS sia meno ferrato, ma con
altri linguaggi sono molto più allenato ed i problemi persistono
comunque.
Ciao e alla prossima...

 non sia perfettamente idoneo, per c'è anche un altro fatto.
Ci possono essere tutti i "fatti" che vuoi, ma anche i "dati di fatto" di
questo thread sono imprescindibili. Ed io su questi mi baso:
a) Hai addossato la colpa di errori tuoi ad explorer quando quest'ultimo
stava facendo le cose secondo gli standard.
b) Hai affermato che la Microsoft aveva implementato metodi fuori standard
per voler fare le cose sempre a modo suo; quando invece erano due metodi
definiti dal w3c.
c) Hai cercato constantemente giustificazioni, tirando in ballo cose come
"era normale che fraintendessi, ho cercato su google ed il primo sito
ufficiale di spiegazione delle funzioni è MSDN"; quando bastava essere meno
superficiali, cliccarci sopra, e scoprire che di standard si trattava.
Tra una cosa e l'altra, hai continuamente tentato di sparare a zero sulla
microsoft e internet explorer a prescindere; riuscendoci malamente tra
l'altro (l'onchange dei checkbox, l'appendChild)
Ora, ti ripeto, a me IE non piace. Non lo reputo un gran browser.
Ma mi piace ancora meno quando si tenta dare la colpa a qualcosa o qualcuno
quando questa non ce l'ha; e l'errore è nostro. Mi piace ancora meno quando
ci si continua a giustificare di un qualcosa che non necessita di
giustificazioni, perché così è andata.
Vuoi prendertela con IE? D'accordo, ma quando c'è motivo reale. Quando è
lui a defettare e non tu. Non quando lui le cose le fa bene, e sei tu che
sbagli. Usi il createElement e imprechi perché su IE non funziona come ti
aspetti? Perfetto, hai ragione. Tenti di agganciare una riga ad una tabella
senza passare dal tbody? hai sbagliato tu, non lui. Punto. Non c'è molto
altro da dire. Dargli addosso in tali contesti è del tutto fuori luogo.
