Autor Zpráva
perun
Profil
Mám vytvorenú tabuľku, v ktorej je potrebné ako reakciu na zaškrtnutie/odškrtnutie checkboxu povoliť alebo zakázať zobrazenie určitých stľpcov. Tabuľka má aj hlavičku (ale tvorenú td), ktoré majú nastavený colspan. Každá bunka, ktorá sa má skrývať a objavovať má svoje vlastné id. Stľpce sú na začiatku zobrazené.

Po odškrtnutí sa príslušným td pomocou javacriptu nastaví display = 'none' a zmiznú. Zmenší sa aj hodnota colspan. Všetko je v poriadku.

Keď sa checkbox opäť zaškrtne, javascript nastaví bunkám display='table-cell' (resp. display='block' pre IE) a zväčší colspan. Testoval som s Opere, Firefoxe a IE6. Opera a IE6 zobrazí všetko v poriadku. Firefox nesprávne zobrazuje hlavičku - ako keby vloží 'prázdnu bunku' (neexistuje, iba opticky to vyzerá, že tam bunka je) a posunie zvyšné bunky doprava. Umiestnenie 'prázdnej bunky' závisí na poradí zmeny colspan.

Firebug zobrazuje, že všetky elementy a javascriptové premenné majú správne hodnoty.

Nejaká idea, ako dosiahnuť správneho správania po návrate pôvodných hodnôt colspan vo firefoxe, tazk, aby sa mi nevytvárala fantómová bunka?

Pred vypnutím stľpcov:


Po vypnutí stľpcov:


A po ich opätovnom zapnutí:


//zobrazenie bunky
function showCell(_id) {
    if (cells[_id] > 0) {
        cells[_id]--;
    }
    if (cells[_id]==0) {
        try {
            this.document.getElementById(_id).style.display = 'table-cell'; //FF
        }
        catch (err) {
            this.document.getElementById(_id).style.display = 'block'; //IE
        }
    }
}

//skrytie bunky
function hideCell(_id) {
    cells[_id]++;
    if (cells[_id]>0) {
        //this.document.getElementById(_id).style.visibility = 'hidden';
        this.document.getElementById(_id).style.display = 'none';
    }
}

// táto funkcia sa volá ako reakcia na zmenu checkboxu. show obsahuje true alebo false
// headers je pole obsahujúce id hlavičiek, ktorym sa bude menit colspan (TM, O2, Vodafone, Spolu)
function showUnique(show) {
    bShowUniq = show;
    for (i=0; i<uniq.length; i++) {
        if (show) {
            showCell(uniq[i]);
        }
        else {
            hideCell(uniq[i]);
        }
    }
    if (show) {
        for (i=0; i<headers.length; i++) {
        this.document.getElementById('td_mt').colSpan*=2;
        this.document.getElementById('td_mo').colSpan*=2;
        //for (i=headers.length-1; i>=0; i--) {
            this.document.getElementById(headers[i]).colSpan*=2;
        }
    }
    else {
        this.document.getElementById('td_mo').colSpan/=2;
        this.document.getElementById('td_mt').colSpan/=2;
        for (i=0; i<headers.length; i++) {
            this.document.getElementById(headers[i]).colSpan/=2;
        }
    }

}
peta
Profil
- v prvni rade bych se vykaslal na zmenu display a menil className, cimz ti vypadne podminkovani IE / FF

- pokud tam uz nejakou className mas, tak bych pouzil funkci neco jako:
function obj_class(obj,classN,add)
{
var reg,x;
if (obj==null) {return false;}
reg = new RegExp("(^"+classN+" )|(?: ("+classN+" ))|( "+classN+"$)|(^"+classN+"$)","g");
obj.className = obj.className.replace(reg,'');
if (add) {obj.className = ((obj.className!="") ? obj.className+' ' : '' ) + classN;}
return true;
}

- pokud se ti rozbiji ramecky a FF ukazuje spravny generated source kod (lze ziskat pres development toolbar plugin nebo oznacenim tabulky - prave tl - zobraz zdrojovy kod vyberu), pak jde mozna o chybu vykreslovani FF a melo by se to nahlasit. Avsak si myslim, ze spis nee.
Nicmene je mozne jeste generovat celou tabulku znova pomoci JS, neco jako:
http://peter-mlich.wz.cz/x/ww/js/jspriklady.htm
- js-tab - kde snimam celou tabulku a pak ji pres JS dodam vlastnosti pripadne vygeneruji serazenou

Z tveho odkazu na zdrojovy kod totiz vice vycist nelze. K obrazkum ti muzu rici, ze tam mas chybne vykreslene ramecky. Vic konstatovat nelze. Maximalne hadat proc asi. Nekde bych tu mel mit kristalovou kouli, treba mi ten kod da ona :)
los
Profil *
Bez odkazu na stránku s ukážkou, kde to nefunguje, sa nedá dobre poradiť.

for (i=0; i<headers.length; i++) {
  this.document.getElementById('td_mt').colSpan*=2;
  this.document.getElementById('td_mo').colSpan*=2;
To znamená, že keď sú v tabuľke 4 hlavičky, tak sa to má 4-krát vynásobiť dvomi?

try {
  this.document.getElementById(_id).style.display = 'table-cell'; //FF
}
catch (err) {
  this.document.getElementById(_id).style.display = 'block'; //IE
}
Toto sa dá zapísať jednoduchšie:
document.getElementById(_id).style.display = ""
perun
Profil
Ďakujem za odpovede.

v prvni rade bych se vykaslal na zmenu display a menil className
To nie je zlý nápad, ale v mojom konkrétnom prípade ťažšie použiteľný, pretože potrebujem odkrývať a zakrývať riadky a stľpce podľa rôznych kritérií.

pokud se ti rozbiji ramecky a FF ukazuje spravny generated source kod (lze ziskat pres development toolbar plugin nebo oznacenim tabulky - prave tl - zobraz zdrojovy kod vyberu), pak jde mozna o chybu vykreslovani FF a melo by se to nahlasit.
Práve o toto mi ide. Dev toolbar a firebug ukazujú správny xhtml kód, problém je naozaj len so zobrazením vo firefoxe.

To znamená, že keď sú v tabuľke 4 hlavičky, tak sa to má 4-krát vynásobiť dvomi?
Nie :) Zle som ten kód vystrihol.

Ad kryštáľová guľa: zdrojový kód bol obrovský, tak som ho nepridával, ale vytvoril som malú stránku ako príklad, kde je použitý rovnaký spôsob a vo firefoxe taktiež nefunguje. Prikladám:

<?xml version="1.1" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Štatistiky</title>
<style>

body, html {
  font-family: arial;
  font-size: 10px;
}

table {
  border-collapse: collapse;
  border: solid 1px black;
  margin: 10px;
}

th {
  padding: 2px 5px;
  background-color: silver;
  border: solid 1px black;
}

td {
  padding: 2px 5px;
  border: solid 1px black;
  text-align: right;
}

td.even {
  background-color: #e0e0e0;
}

</style>

</head>
<body>


<h2>Tabuľka používanosti:</h2>
<table>
  <tr>
    <td class='even'>&nbsp;</td>
    <td class='even' colspan='2' id='td_1'>wrrrrr</td>
    <td class='even' colspan='2' id='td_2'>chrrrr</td>
  </tr>
  <tr>
    <td class='odd' id='td_3'>Riadok 1</td>
    <td class='odd' id='td_4'>26</td>
    <td class='odd' id='td_5' style='background-color: steelblue'>10 919</td>
    <td class='odd' id='td_6'>0</td>
    <td class='odd' id='td_7' style='background-color: steelblue'>10 945</td>
  </tr>
  <tr>
    <td class='even' id='td_8'>Riadok 2</td>
    <td class='even' id='td_9'>31 042</td>
    <td class='even' id='td_10' style='background-color: steelblue'>451 413</td>
    <td class='even' id='td_11'>102 547</td>
    <td class='even' id='td_12' style='background-color: steelblue'>585 002</td>
  </tr>
</table>

<script language='javascript' type='text/javascript'>
rows = new Array('td_3', 'td_4', 'td_5', 'td_6', 'td_7');
cols = new Array('td_4', 'td_6', 'td_9', 'td_11');
uniq = new Array('td_5', 'td_7', 'td_10', 'td_12');
headers = new Array('td_1', 'td_2');
cells = new Array()

bShowUniq = true;

cells['td_3'] = 0;
cells['td_4'] = 0;
cells['td_5'] = 0;
cells['td_6'] = 0;
cells['td_7'] = 0;
cells['td_8'] = 0;
cells['td_9'] = 0;
cells['td_10'] = 0;
cells['td_11'] = 0;
cells['td_12'] = 0;

function showCell(_id) {
    if (cells[_id] > 0) {
        cells[_id]--;
    }
    if (cells[_id]==0) {
        //this.document.getElementById(_id).style.visibility = 'visible';
        ///*
        try {
            this.document.getElementById(_id).style.display = 'table-cell'; //FF
        }
        catch (err) {
            this.document.getElementById(_id).style.display = 'block'; //IE
        }
        //*/
    }
}

function hideCell(_id) {
    cells[_id]++;
    if (cells[_id]>0) {
        //this.document.getElementById(_id).style.visibility = 'hidden';
        this.document.getElementById(_id).style.display = 'none';
    }
}

function showUnique(show) {
    bShowUniq = show;
    if (!show) {
        for (i=0; i<headers.length; i++) {
            this.document.getElementById(headers[i]).colSpan/=2;
        }
    }
    for (i=0; i<uniq.length; i++) {
        if (show) {
            showCell(uniq[i]);
        }
        else {
            hideCell(uniq[i]);
        }
    }
    if (show) {
        for (i=0; i<headers.length; i++) {
        //for (i=headers.length-1; i>=0; i--) {
            this.document.getElementById(headers[i]).colSpan*=2;
        }
    }
}

function showRowDetails(show) {
    for (i=0; i<rows.length; i++) {
        if (show) {
            showCell(rows[i]);
            for (j=0; j<dates.length; j++) {
                //dates[i].rowSpan = 3;
            }
        }
        else {
            hideCell(rows[i]);
            for (j=0; j<dates.length; j++) {
                //dates[i].rowSpan = 1;
            }
        }
    }
}

function showColDetails(show) {
    mul = bShowUniq?2:1
    if (show) {
        this.document.getElementById('td_mo').colSpan = (4)*mul;
        this.document.getElementById('td_mt').colSpan = (4)*mul;
    }
    else {
        this.document.getElementById('td_mo').colSpan = mul;
        this.document.getElementById('td_mt').colSpan = mul;
    }
    for (i=0; i<cols.length; i++) {
        if (show) {
            showCell(cols[i]);
        }
        else {
            hideCell(cols[i]);
        }
    }
}

</script>
<form method='get' action='' onsubmit='return false;'>
Zobraziť <input type='checkbox' onclick='showUnique(this.checked)' checked /><br />
</form>
</body>
</html>


Ak by sa na to niekto pozrel a potvrdil/vyvrátil mi, že vo firefoxe je naozaj problém a prípadne by poznal riešenie, bol by som veľmi vďačný.
los
Profil *
Mne to vo Firefoxe funguje. Skús si to zobraziť vo Firefoxe v safe móde, či to nespôsobuje nejaké rozšírenie.

Trochu by som to zjednodušil. Napr. takto:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="content-type" content="text/html;charset=utf-8" />
		<title>Štatistiky</title>
		<style type="text/css">
body, html { font-family: arial; font-size: 10px; }
table { border-collapse: collapse; border: solid 1px black; margin: 10px; }
th { padding: 2px 5px; background-color: silver; border: solid 1px black; }
td { padding: 2px 5px; border: solid 1px black; text-align: right; }
tr.even td { background-color: #e0e0e0; }
table td.uniq { background-color: steelblue; }
table.hidden td.uniq { display: none; } 
		</style>
	</head>
	<body>
		<h2>Tabuľka používanosti:</h2>
		<table id="table">
			<thead>
				<tr class="even">
					<td>&nbsp;</td>
					<td colspan="2" class="dyn">wrrrrr</td>
					<td colspan="2" class="dyn">chrrrr</td>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td>Riadok 1</td>
					<td>26</td>
					<td class="uniq">10 919</td>
					<td>0</td>
					<td class="uniq">10 945</td>
				</tr>
				<tr class="even">
					<td>Riadok 2</td>
					<td>31 042</td>
					<td class="uniq">451 413</td>
					<td>102 547</td>
					<td class="uniq">585 002</td>
				</tr>
			</tbody>
		</table>
<script type="text/javascript">//<![CDATA[
function showUnique(show) {
	var table = document.getElementById("table");
	table.className = show ? "" : "hidden";

	for (var j = 0; j < table.tHead.rows.length; ++j)
		for (var i = 0; i < table.tHead.rows[j].cells.length; ++i)
			if (table.tHead.rows[j].cells[i].className == "dyn")
				table.tHead.rows[j].cells[i].colSpan = show ? 2 : 1;
}
//]]></script>
		<form method="get" action="" onsubmit="return false;">
			<p>
				Zobraziť <input id="show-unique" type="checkbox" onclick="showUnique(this.checked)" checked="checked" /><br />
				<script type="text/javascript">showUnique(document.getElementById("show-unique").checked)</script>
			</p>
		</form>
	</body>
</html>

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0