Archive

Posts Tagged ‘Javascript’

Javascript: inserire ed eliminare righe ed altri oggetti in una tabella

October 7th, 2008 Nicola 3 comments

Un piccolo pezzo di codice di un’applicazione web che ho realizzato qualche tempo fa, che prevedeva l’inserimento e la cancellazione a runtime di nuove righe in una tabella.

Il punto di partenza è una riga di una table, con due colonne, come questa:

Cliccando sul si ottiene il seguente effetto: viene creata una nuova riga, sempre di due colonne, e nella seconda colonna viene creata una lista (ul) contenente tre elementi. Nell’esempio che ho riportato qui vengono create 5 righe ed in ognuna di queste una lista di 3 elementi. Il risultato è questo:

Nella riga originaria il viene sostituito con il , e la funzione javascrit associata al click sul viene creata al volo.

Le funzioni utilizzate per la creazione di nuovo elementi sono:

  • document.createElement: crea un elemento dom all’interno del Document
  • document.createTextNode: crea il contenuto di un nodo
  • insertRow: metodo di TABLE che inserisce una nuova riga in una determinata posizione
  • deleteRow: motodo di TABLE per rimuovere una riga in una determinata posizione

Partiamo dall’html. La tabella è scritta in questo modo:

<table id="tabella" class="datatable" border="0">
<tbody>
<tr id="tr_1" class="tr_sms">
<td id="td_1" class="testosms_piu" onclick="inserisciRiga(1)">ciao</td>
<td class="testosms">Io sono la prima riga della tabella</td>
</tr>
<tr id="tr_2" class="tr_sms">
<td id="td_2" class="testosms_piu" onclick="inserisciRiga(2)"></td>
<td class="testosms">Io sono la seconda riga della tabella</td>
</tr>
</tbody></table>

La funzione javascript inserisciRiga(x) accetta in ingresso la posizione della riga. In questo piccolo esempio è tutto statico, ma quando le righe sono generate dinamicamente (io per esempio ero all’interno di una jsp) l’indice viene anch’esso generato al volo. Da notare che l’id della riga deve essere tr_<indice> per poter poi essere recuperato del getElementById

Ecco com’è inserisciRiga:

function inserisciRiga(riga)
{
var numerorighe = 5;
var row = document.getElementById('tr_' + riga);
var posizione = row.rowIndex + 1;
for (i=0; i<5; i++) {
accoda(posizione + i, "Primo Elemento della lista", "Secondo elemento della lista", "Terzo elemento della lista");cambiaTestata(posizione, numerosms, riga);
}

Quindi, a partire dalla posizione indicata inserisco 5 righe, dove ogni riga consiste di una lista di 3 elementi. Nella versione orginale questa funzione è, in realtà, restituita da una chiamata Ajax, dove vengono specificate il numero di righe da inserire, il numero di elementi della lista ed il loro contenuto.

La funzione accoda è la seguente:

function accoda(position, campo1, campo2, campo3){// Recupero la tabella dal suo ID
var oTable = document.getElementById('tabella');// Creo la nuova riga e le assegno una classe
var oTr = oTable.insertRow(position);
oTr.className="altrow";// Creo le due colonne e imposto le classi
var oTd1=document.createElement("TD");
oTd1.className="sms_ico";
var oTd2=document.createElement("TD");
oTd2.className="sms";// Creo la lista UL e tutti i LI
var oUL = document.createElement("UL");
oUL.className="sms_lista";
var oLI_Campo1 = document.createElement("LI");
var oLI_Campo2 = document.createElement("LI");
var oLI_Campo3 = document.createElement("LI");

//Aggiungo il contenuto ai tre LI creati
var oText_Campo1 = document.createTextNode(campo1);
var oText_Campo2 = document.createTextNode(campo2);
var oText_Campo3 = document.createTextNode(campo3);

// Ora che ho creato tutti gli oggetti, li devo appendere ognuno
// dentro il relativo padre
oLI_Campo1.appendChild(oText_Campo1);
oLI_Campo2.appendChild(oText_Campo2);
oLI_Campo3.appendChild(oText_Campo3);
oUL.appendChild(oLI_Campo1);
oUL.appendChild(oLI_Campo2);
oUL.appendChild(oLI_Campo3)
oTd2.appendChild(oUL);
oTr.appendChild(oTd1);
oTr.appendChild(oTd2);

}

E’ tutto qui:

  • Si recupera la tabella (document.getElementById(‘tabella’);)
  • Si crea una nuova riga (oTable.insertRow(position);)
  • Si creano tutti gli oggetti all’interno della riga (document.createElement, document.createTextNode)
  • Si appendono tutti gli elementi alla nuova riga (appendChild)

Sia la sostituizione del con il , sia quella della funzione javascript da chiamare viene effettuata dalla funzione cambiaTestata:

function cambiaTestata(pos, numerosms, idinvio) {

//Recupero la colonna interessata
var oTable = document.getElementById(‘tabella’);
var oRow = oTable.rows[pos - 1];
var col = oRow.getElementsByTagName(‘TD’)[0];
//Sostituisco l’icona utilizzando una diversa classe css
col.className=”testosms_meno”;
//Sostituisco la funzione onClick esistente:
col.onclick = function () { rimuovi(idinvio, numerosms); };

}

La funzione rimuovi invece, fa tornare la tabella allo stato originario:

function rimuovi(id, numrighe) {

//Recupero la colonna interessata
var oRow = document.getElementById(‘tr_’ + idinvio);
var col = oRow.getElementsByTagName(‘TD’)[0];
col.className = “testosms_piu”;

//Elimino tutte le righe inserite precedentemente
var oTable = document.getElementById(‘tabella’);
var i;
var posizione = oRow.rowIndex + 1;
for (i=0; i oTable.deleteRow(posizione);

//Aggiorno l’evento on Click della colonna
col.onclick = function () { inserisciRiga(id); };

}

Direi che è tutto.

Categories: Programmazione Web Tags: , ,

Javascript, setAttribute e… Explorer 6!!

June 24th, 2008 Nicola No comments

Stavo scrivendo questo codice:

var oTable = document.getElementById('tabella');
var oTr = oTable.insertRow(posizione);
oTr.className="altrow";
var oTd1=document.createElement("TD");
var oTd2=document.createElement("TD");
oTd1.className="sms_about";
oTd2.className="sms";
oTd2.setAttribute("colspan","7");
...

per inserire una riga dinamicamente ad una tabella. Ma l’istruzione:

oTd2.setAttribute("colspan","7");

funzionava con Firefox, Safari e Opera, non con Explorer 6/7.

La soluzione al problema è qua :

http://webbugtrack.blogspot.com/2007/08/bug-242-setattribute-doesnt-always-work.html

il mio problema si è risolto così:

oTd2.setAttribute("colSpan","7");

Poi dicono che le maiuscole non contano per la Microsoft…

Javascript, Explorer e checkbox create dinamicamente

June 17th, 2008 Nicola No comments

Un piccolo problema conosciuto. Sto creando dimamicamente una tabella, e all’interno della tabella inserisco dei tag INPUT di tipo checkbox.

Il mio codice iniziale era:

var oTable = document.getElementById('tabellasmsbody');
var oTr = oTable.insertRow(-1);
var oTd1=document.createElement("TD");
var oTd3=document.createElement("TD");
var oTd4=document.createElement("TD");
var oCheckTd1 = document.createElement("INPUT");
oCheckTd1.setAttribute("type","checkbox");
oCheckTd1.setAttribute("value",id);
oCheckTd1.setAttribute('checked', 'checked');
var oTextTd3 = document.createTextNode(numero);
var oTextTd4 = document.createTextNode(anagrafica);
oTd1.appendChild(oCheckTd1);
oTd3.appendChild(oTextTd3);
oTd4.appendChild(oTextTd4);
oTr.appendChild(oTd1);
oTr.appendChild(oTd3);
oTr.appendChild(oTd4);
oTable.appendChild(oTr);

Funziona con tutti i browser tranne che con la magica coppia Explorer 6/7. Niente di cui meravigliarsi.

Su questo sito ho trovato la soluzione:

http://webbugtrack.blogspot.com…

sostituento “checked” con “defaultchecked”:

oCheckTd1.setAttribute('defaultChecked', 'defaultChecked');

funziona solo con Explorer 6/7. Niente di cui meravigliarsi.

Mettendo entrambi:


oCheckTd1.setAttribute('defaultChecked', 'defaultChecked');
oCheckTd1.setAttribute('checked', 'checked');

funziona con tutti i brower.

Javascript, getYear(), getFullYear(), Firefox

April 17th, 2008 Nicola No comments

Il problema delle 12:31 è il seguente:

Il codice javascript:
data = new Date();

hour = data.getHours();
minute = data.getMinutes();
second = data.getSeconds();

year = data.getYear();
month = data.getMonth() + 1;
day = data.getDay() + 1;

Restituisce, come valore per year 108. Su Firefox 2. 2008 su Explorer. E’ la prima volta che mi capita di vedere funzionare meglio Explorer ma tant’è…

In ogni caso, per avere il valore corretto si può usare:
year = data.getFullYear();
e tutto si sistema.

Filmato Flash sopra altri oggetti della pagina

April 2nd, 2008 Nicola 3 comments

Ho avuto questo problema: un menù di una pagina, (css + javascript) si apriva sopra un filmato flash, rimanendone però sotto invece che sopra.

Cercando su google ho risolto inserendo questo parametro nel tag OBJECT riferito al filmato:

<PARAM NAME=wmode VALUE=transparent>

Con questo l’errore si è risolto ed il menù ora non viene coperto dal flash.

Categories: Programmazione Web Tags: , ,