Dat stukje code dat ik gaf werkt gewoon. Hoe je het dus ook interpreteert, je loopt de loop maar 3 keer door en dat moet 9 keer worden. Daarbij zal hij 3 keer zeggen dat het een row + cols moet zijn en 6 keer alleen een col. Code is getest en werktquote:Op dinsdag 29 januari 2008 13:01 schreef Tuvai.net het volgende:
[..]
Het opruimen is voor naderhand, als het functioneel is.
[..]
![]()
Het loopen klopt hoor. In het voorbeeld hierboven waren aRows en aCols beiden 3. In loop 1 gaat de code door de rijen, en in deze loop vindt ook weer een loop plaats die het aantal cellen aanmaakt. Wat dat betreft klopt dat stukje. Het probleem zit 'm hier in het feit dat de innerHTML output raar is, terwijl als ik de output als text naar een textarea parse, deze wel 100% correct is.
Tevens heb ik zojuist hetzelfde geprobeert met <div> jes in plaats van een <table> met daarin <tr> en <td> tags. Dit werkte wel. Alsof innerHTML me niet toelaat tabelletjes te maken. >_>
Hoe kom je toch bij die 3 keer?quote:Op dinsdag 29 januari 2008 13:08 schreef Tarabass het volgende:
Dat stukje code dat ik gaf werkt gewoon. Hoe je het dus ook interpreteert, je loopt de loop maar 3 keer door en dat moet 9 keer worden.
Bij het innerHTML gedeelte ging 'ie inderdaad de fout in. Het werkt nu; ik heb sowieso de tabel vervangen door <div>jes (het hele programma`tje/site`je is immers al conform XHTML strict opgebouwdquote:Op dinsdag 29 januari 2008 13:03 schreef fokME2 het volgende:
Ik had het vermoeden dat het fout ging bij het "innerHTML+= ...". De functie een heeeel klein beetje omgebouwd en hij werkt hier nu in Opera 9, Firefox 2 en IE6.
[ code verwijderd ]
Is het niet een idee om helemaal "netjes" met docum ent.createElement() en appendChild te werken?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | { var table = document.createElement('TABLE'); var row, cell; for (var j = 0; j < numRows; ++j) { row = table.insertRow(-1); for (var i = 0; i < numCols; ++i) { cell = row.insertCell(-1); cell.appendChild(document.createTextNode(i + ':' + j)); } } parent.appendChild(table); } |
Ja, je hebt gelijk. Je hebt de loopjes inderdaad wat anders staan en ik gaf mijn commentaar aan de hand van mijn snippet, waarin hij dus de loop maar 3 keer zou doorlopen en dus maar op 1 rij zou uitkomen. Verwarring van mijn kant, sorry daarvoor. Ik iig blij dat het gelukt is, die van jou is inderdaad mooier en korter. Denk dat ik dat snippetje even overneemquote:Op dinsdag 29 januari 2008 13:22 schreef Tuvai.net het volgende:
Hoe kom je toch bij die 3 keer?Zie je wel dat er een volledig andere loop (voor de <td> tags) in m'n eerste loop (voor de <tr> tags) staat? Sowieso worden het aantal rijen aangemaakt a.h.v. de eerste loop, en elke keer dat die plaatsvindt, word ook de loop daarbinnen aangeroepen. Zie m'n output naar het <textarea> element, die werkt gewoon.
Bah, remco! Jij komt ook altijd met een nog betere oplossingquote:Op dinsdag 29 januari 2008 13:23 schreef SuperRembo het volgende:
Of m.b.v. DOM functies:
[ code verwijderd ]
(Super)Rembo is met een b, desnoods met een k, maar nooit met een c!quote:Op dinsdag 29 januari 2008 13:29 schreef Tarabass het volgende:
[..]
Bah, remco! Jij komt ook altijd met een nog betere oplossing
Het is eigenlijk altijd beter om een property op het object te zetten i.p.v. een attribute met setAttribute().quote:Op dinsdag 29 januari 2008 13:43 schreef Tarabass het volgende:
setAttribute('id','naam_id');
Sorry, RemKoquote:Op dinsdag 29 januari 2008 14:10 schreef SuperRembo het volgende:
(Super)Rembo is met een b, desnoods met een k, maar nooit met een c!
Ik zou graag zo willen denken als jij (bah wat klinkt dat gay) maar dan zullen we wel moeten weten waarom het is. Dus waarom liever een property dan de functie setAttribute()?quote:Het is eigenlijk altijd beter om een property op het object te zetten i.p.v. een attribute met setAttribute().
Dus
el.id = "foo";
i.p.v.
el.setAttribute("id", "foo");
1 2 3 | el.setAttribute('class', 'foo'); // Werkt in FF, werkt niet in IE el.setAttribute('className', 'foo'); // Werkt in IE, werkt niet in FF |
Kortom die heb je niet echt nodig wanneer je toch al netjes je HTML in orde hebt.quote:Op dinsdag 29 januari 2008 16:44 schreef SuperRembo het volgende:
Het is korter en duidelijker.
Ik denk dat 't sneller is (maar heb ik niet getest)
Het kan problemen geven zoals bij het zetten van een class:
[ code verwijderd ]
Je zal wel setAttribute() moeten gebruiken als je later nog de innerHTML van het element wil ophalen (maar waarom zou je dat willen?)
getAttribute() heb je eigenlijk allen nodig als je een property wil opvragen die niet in de HTML standaard gedefinieerd is.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | { var table = document.createElement('TABLE'); var row, cell; for (var j = 0; j < numRows; ++j) { row = table.insertRow(-1); for (var i = 0; i < numCols; ++i) { cell = row.insertCell(-1); //Werkt alleen in FF onclickstring = 'showhide(\'' + parent + '\',\'' + parent.id + '\');setColor(\'' + curColor + '\'); return false'; cell.setAttribute('onclick',onclickstring); //Werkt cross-browsed maar wordt al aangeroepen bij het aanmaken van het table en niet bij klikken op cel cell.onclick = new function() {alert('Hello World!');}; cell.appendChild(document.createTextNode(i + ':' + j)); } } parent.appendChild(table); } |
1 |
Dat werkt wel maar is niet wat ik wil. Bovendien wordt de alert al aangeroepen bij het maken van het table, dus laat ik de table aanmaken dan krijg ik eerst 7*9 alert-boxjes, ipv één alert-boxje bij het klikken van een celquote:Op woensdag 30 januari 2008 13:58 schreef fokME2 het volgende:
[ code verwijderd ]
Geen new function, maar gewoon function (). Dan werkt het wel?
Tja, w3schools heeft wel een paar leuke voorbeelden, zo ook tizag. Verder is google natuurlijk je beste vriend..quote:Op woensdag 30 januari 2008 14:38 schreef Dzy het volgende:
[knip]
1 |
Dat is hem inderdaad bijnaquote:Op woensdag 30 januari 2008 15:06 schreef fokME2 het volgende:
@Tarabass: Als ik "function" doe ipv "new function" met jou functie dan wordt er alleen gealert als ik klik op een td? Zowel in IE6, FF2 en Opera 9?
[ code verwijderd ]
?
1 |
Schiet mij maar lek, maar ik begrijp je niet denk ik. Het werkt wel overigens hoor, maar begrijpen is een tweede.quote:Op woensdag 30 januari 2008 15:50 schreef fokME2 het volgende:
Dat is helemaal niet zo raar. Op het moment dat de backgroundcolor wordt geset is de loop nog bezig. Als de loop klaar is dan blijft curColor de kleur van de laatste cell. (Doe eens alert(curColor) na appendChild van de table.)
Als je op een cell klikt, dan wordt curColor uitgelezen wat op dat moment de laatste kleur is uit de loop.Een oplossing zou kunnen zijn om de achtergrondkleur van de cell waarop je klikt mee te geven aan de functie:
[ code verwijderd ]
Verdiep je eens in closuresquote:Op woensdag 30 januari 2008 16:29 schreef Tarabass het volgende:
[..]
Schiet mij maar lek, maar ik begrijp je niet denk ik. Het werkt wel overigens hoor, maar begrijpen is een tweede.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |