Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[JavaScript] Firefox herkent children niet voor table cell

Pagina: 1
Acties:

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16-11 12:56

Robtimus

me Robtimus no like you

Topicstarter
Ik heb een stuk code dat nu prima werkt in IE, Opera en Konqueror. Helaas is Firefox nog een spelbreker.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function setItemOrder(table)
{
    var rows = table.getElementsByTagName("tr");
    var order = 0;
    for (i = 0; i < rows.length; i++)
    {
        if (rows[i].getAttribute("itemRow"))
        {
            var cell = rows[i].cells[0];
            var input = cell.children[0];
            input.value = order;
            order++;
        }
    }
}

Alle rijen (met itemRow="true") hebben in de eerste cell een hidden input field. Hiervan wil ik de waarde veranderen.

Debuggen leert me dat children undefined is als ik dit in Firefox uitvoer. Ik heb daarna zitten zoeken en kwam childNodes tegen (alsmede firstChild), maar deze hebben een probleem: Spleasure in "\[XML/DOM/JS] undefined in Firefox". Ik mag deze indenting niet weghalen, dus childNodes en firstChild zijn anders in IE enerzijds (het input element) en Opera, Konqueror en Firefox anderzijds (de tekst ervoor).

Ik wil graag de code zo simpel mogelijk houden, zonder allerlei case statements voor verschillende browsers oid. Is dit mogelijk?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • BHR
  • Registratie: Februari 2002
  • Laatst online: 15-11 17:39

BHR

JavaScript:
1
var input = cell.getElementsByTagName("*")[0]; 

No amount of key presses will shut off the Random Bug Generator


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16-11 12:56

Robtimus

me Robtimus no like you

Topicstarter
BHR schreef op donderdag 18 september 2008 @ 12:14:
JavaScript:
1
var input = cell.getElementsByTagName("*")[0]; 
HELD! _/-\o_ _/-\o_
Zo simpel maar gewoon niet aan gedacht. Het werkt idd perfect, ook in Chrome.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 14-11 21:30

JayVee

shibby++!

JavaScript:
1
var input = cell.childNodes[0];

Oh wacht, TS niet goed gelezen, never mind }:O

[ Voor 29% gewijzigd door JayVee op 18-09-2008 12:25 ]

ASCII stupid question, get a stupid ANSI!


Verwijderd

BHR schreef op donderdag 18 september 2008 @ 12:14:
JavaScript:
1
var input = cell.getElementsByTagName("*")[0]; 
Ik zou zelf liever "input" ipv "*" gebruiken, dan hoef je deze code niet ook aan te passen als de HTML wordt veranderd.

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 15-11 17:39

BHR

Select is ook een invoer element :) Op deze manier vind ik het toekomstbestendiger. Tevens waarschijnlijk zal het aantal childnodes van cell toch laag zijn, dus een ruimer "filter" nemen zal qua performance niet zo veel uitmaken.

No amount of key presses will shut off the Random Bug Generator


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:18

crisp

Devver

Pixelated

zelf gebruik ik gemanipuleerde versies van de white-space ignoring DOM iteration functies zoals te vinden op http://developer.mozilla.org/En/Whitespace_in_the_DOM

In dit geval zou je dan dit kunnen gebruiken:
JavaScript:
1
2
3
4
5
6
var input = first_child(cell);
if (input)
{
  // check eventueel ook nog nodeName/tagName
  input.value = order;
}

Intentionally left blank


  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

FYI twee micro-optimalisaties.
var rows = table.getElementsByTagName("tr");
De rijen van een tabel kun je direct via het DOM benaderen: table.rows
for (i = 0; i < rows.length; i++)
Bij iedere iteratie wordt nu rows.length opnieuw opgevraagd. Let hierop als je ooit een ingewikkeldere berekening neerzet in de conditie, of als je voorziet dat deze loop enorm veel wordt doorlopen.

TabCinema : NiftySplit


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16-11 12:56

Robtimus

me Robtimus no like you

Topicstarter
Bozozo schreef op donderdag 18 september 2008 @ 19:38:
FYI twee micro-optimalisaties.


[...]

De rijen van een tabel kun je direct via het DOM benaderen: table.rows
Maar nu krijg ik ze allemaal, niet alleen de directe rows. Waar het mij om gaat zijn de rows uit de tabellen uit de rows ;)
Nu kan ik wel een dubbele loop uitvoeren, maar dit is veel handiger.
[...]

Bij iedere iteratie wordt nu rows.length opnieuw opgevraagd. Let hierop als je ooit een ingewikkeldere berekening neerzet in de conditie, of als je voorziet dat deze loop enorm veel wordt doorlopen.
Ik heb al 8 jaar ervaring in Java (de echte taal :P) dus ik ben op de hoogte van wat er wanneer wordt uitgevoerd. Dit zijn in dit geval echter micro optimalizaties die waarschijnlijk nog geen milliseconde aan performance winst zullen opleveren, tenzij je duizenden rows krijgt.

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1