Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    1 Soluzione: Data Cella Di Tavola Complessa Trova Tutte Le Celle Della Sua Colonna

    Di solito nei forum si fanno delle domande - più raro che invece si propongano fin da subito delle soluzioni.

    Il problema è: data una tavola html, trova da una sua cella tutte le celle impilate nella sua colonna.

    Il problema è spinoso per questi motivi: non c'è allo stato attuale un metodo nativo di Javascript che permetta di farlo (c'è per le righe, non per le colonne), e inoltre se il compito sarebbe addirittura banale su una tavola che non presenta colspan e rowspan in nessuna cella, può diventare invece assai problematico su tavole complesse.

    Problematico quanto? Quanto 48 ore di lavoro e un gran mal di testa.

    In questo caso, essendo un compito che può essere richiesto ma per il quale non sovrabbondano le soluzioni online, prima che qualcuno perda 48 ore a trovare una soluzione, o altre 24 a trovarne online e poi valutarle magari per scoprire che non fungono, ne propongo una (senza la pretesa che sia ottimale, ma solo con la speranza che possa almeno fornire delle idee su come affrontare il problema e risparmiare mal di capa a chi nel forum possa trovarsi davanti una domanda simile): Javascript Map Html Table Highlight Cells By Column Respect Rowspans And Colspan

    Non la ho testata su ogni tavola possibile e immaginabile, ovviamente, ma la logica sembra convincente e la implementazione dovrebbe esserlo. Chiaro che se qualcuno trovasse degli errori, fate sapere.

  2. #2
    Oh della serie non si finisce mai di imparare...

    Lo script, testato su FF andava alla grande. Logica convincente, niente di strano. Che bisogno c'era di testarlo su IE? Sono certo della logica...

    Ahi ahi ahi, e se la logica non c'entrasse?

    Infatti, scopro oggi che su IE non funzionava.
    Inizio il debug e destrutturo riga per riga - ecco, a Explorer non piaceva questo:
    this.enum

    Apparentemente, enum lo ritiene dunque una parola chiave. Cambiato in enums infatti non dà pù problemi e fila come l'olio.

    Quindi per chiunque stia leggendo - una ulteriore conferma che explorer ha un modo un po' suo di interpretare i namespace.

    Perchè enum apparirebbe in effetti menzionata come reserved keyword per il futuro in ECMAScript ma non si capisce perchè allora un browser ligio come FF agli standard non crea (giustamente) conflitto e IE invece sì - tanto più che 'enum' era assegnato alla keyword 'this' per cui diveniva proprietà della istanza e non della window.

    Come impazzire senza motivo - poi si stupiscono che alle volte abbiamo timore a metter mano nei codici degli altri

  3. #3
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    aggiunto a script /discussioni utili

    ciao

  4. #4
    Ah grazie - beh in tal caso allora merita riprodurre i codici anche qui (sia come gesto di riconoscenza per averlo aggiunto, sia per motivi pratici: avere i codici su due server è a questo punto utile se lo script viene segnalato agli utenti come utile), mentre per la documentazione dettagliata rinvio al link del primo post.

    unica cosa, mi ha richiesto parecchio lavoro per cui se viene usato, qualora possibile, è gradito se chi lo usa o mantiene il commento o mette un link (magari nella vostra pagina "siti suggeriti" o simili) alla pagina menzionata nel primo post:

    codice:
    function tableMap(table/*OBJECT*/){//2.0.1
    this.construct=function(t){
    this.enums=[];
    for(var r=0, sum=0; r<t.rows.length; r++, sum=0){ if(!this.enums[r]){this.enums[r]=[];};
    	for(var c=0; c<t.rows[r].cells.length; c++){ t.rows[r].cells[c].rowIndex=r;//opportunistic cell addon
    	var s=0;
    		for(; s<t.rows[r].cells[c].colSpan; s++){/*enumerating:*/
    		var e=sum+s;
    			while(this.enums[r][e]/*met rowspan curtain*/){++e; ++sum;};
    			for(var a=1; a<t.rows[r].cells[c].rowSpan; a++){ if(!this.enums[r+a]){this.enums[r+a]=[]};
    			/*rowspan: anticipate cells:*/this.enums[r+a][e]=t.rows[r].cells[c];
    			}
    		this.enums[r][e]=t.rows[r].cells[c];
    		}
    	sum+=s;
    	}
    }
    /*keep this comment to reuse freely:
    http://www.fullposter.com/?1 */}
    this.construct(table);
    			/***Method:***/
    this.column=function(cell/*OBJECT*/){ var col=[]; var i=0; for(; i<this.enums[cell.rowIndex].length; i++){ if(this.enums[cell.rowIndex][i]==cell){break;}} 
    for(var a=0; a<this.enums.length; a++){col[++col.length-1]=this.enums[a][i];} return col; }
    			/***Method:***/
    this.columns=function(cell/*OBJECT*/){ var col=[]; var i=0; for(; i<this.enums[cell.rowIndex].length; i++){ if(this.enums[cell.rowIndex][i]==cell){break;}} 
    for(var a=0; a<this.enums.length; a++){ for(var s=0; s<cell.colSpan; s++){ col[++col.length-1]=this.enums[a][i+s]; } } return col; }
    }
    Per l' html e i test, ecco il codice - che usa il metodo "column", per utilizzare il metodo "columns" sostituirlo nella espressione
    action=map.column
    aggiungendo la s

    codice:
    <script>
    //REMEMBER to incude your function here, then:
    </script>
    
    click on any cell: <table border="2" cellspacing="6" cellpadding="6" id="foo" style="background-color:#dddddd; font-weight: bold;">
    	<tr>
    	<td>row0 cell 0</td>
    	<td>r0 c0</td>
    	<td>r0 c1</td>
    	<td colspan="4">r0 c2</td>
    	<td>r0 c6</td>
    	<td>r0 c7</td>
    	<td rowspan="2">r0 c8</td>
    	<td>r0 c9</td>
    	</tr>
    
    	<tr>
    	<td>row1 cell 0</td>
    	<td rowspan="4">r1 c0</td>
    	<td colspan="3" rowspan="3">r1 c1</td>
    	<td colspan="3">r1 c4</td>
    	<td>r1 c7</td>
    	<td>r1 c9</td>
    	</tr>
    
    	<tr>
    	<td>row2 cell 0</td>
    	<td>r2 c4</td>
    	<td colspan="3" rowspan="3">r2 c5</td>
    	<td>r2 c8</td>
    	<td>r2 c9</td>
    	</tr>
    
    
    	<tr>
    	<td>row3 cell 0</td>
    	<td>r3 c4</td>
    	<td>r3 c8</td>
    	<td>r3 c9</td>
    	</tr>
    
    	<tr>
    	<td>row4 cell 0</td>
    	<td>r4 c1</td>
    	<td colspan="3" rowspan="2">r4 c2</td>
    	<td>r4 c8</td>
    	<td>r4 c9</td>
    	</tr>
    
    	<tr>
    	<td>row5 cell 0</td>
    	<td>r5 c0</td>
    	<td>r5 c1</td>
    	<td>r5 c5</td>
    	<td>r5 c6</td>
    	<td colspan="3">r5 c7</td>
    	</tr>
    
    	<tr>
    	<td>row6 cell 0</td>
    	<td>r7 c0</td>
    	<td>r7 c1</td>
    	<td>r7 c2</td>
    	<td>r7 c3</td>
    	<td>r7 c4</td>
    	<td>r7 c5</td>
    	<td>r7 c6</td>
    	<td>r7 c7</td>
    	<td>r7 c8</td>
    	<td>r7 c9</td>
    	</tr>
    </table>
    
    <script>
    
    var map=new tableMap(document.getElementById('foo'));
    
    for(var i=0; i<document.getElementById('foo').rows.length; i++){
    for(var ii=0; ii<document.getElementById('foo').rows[i].cells.length; ii++){
    document.getElementById('foo').rows[i].cells[ii].onclick=
    	function(){
    	/*reset cell colors before highlighting*/
    		for(var reset=0; reset<this.parentNode.parentNode.rows.length; reset++){
    			for(var reset2=0; reset2<this.parentNode.parentNode.rows[reset].cells.length; reset2++){
    			this.parentNode.parentNode.rows[reset].cells[reset2].style.backgroundColor='#ffffff';
    			}
    		}
    	/*resetting done*/
    
    	var action=map.column(this);/*change column into columns to use the second method*/
    
    	for(var h=0; h<action.length; h++){action[h].style.backgroundColor='#ff0000';}
    	this.style.backgroundColor='#bb0000';/*slightly differentiate currently clicked for testing purposes*/
    	};
    }
    }
    
    </script>

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.