Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JS]Waarom werkt deze functie alleen in IE en niet in FF?

Pagina: 1
Acties:

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
De volgende code toont en verbergt verschillende contentelementen, namelijk divs.(pagina's)
Echter werkt deze code bij mij alleen in IE browsers, maar niet in Firefox browsers.
Heeft iemand enig idee waarom dat is?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<html>
<head></head>

<body>

<div id="menu">
    <span onclick="changePage(1);">button01</span>
    <span onclick="changePage(2);">button02</span>
                <span onclick="changePage(3);">button03</span>
</div>
<div id="content">
        <div id="1">
        Page 1
    </div>
    <div id="2">
        Page 2
    </div>
    <div id="3">
        Page 3
    </div>
</div>


<script type="text/javascript">

function changePage(paginaNr){  
    
    var NumberOfPages = 3;  
    
    //Verberg alle divs 
    for(i=1; i<=numberOfPages; i++){
        document.getElementById(i).style.visibility = "hidden";
    }
    
    //Toon de opgevraagde div
    document.getElementById(paginaNr).style.visibility = "visible";     
}

</script>

</body>
</html>

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Een identifier moet beginnen met een letter, als ik het me goed herinner. "1" is ongeldig", "p1" is geldig.

We are shaping the future


  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Ik heb het opgelost. Niet alle browsers schijnen document.getElementById() te ondersteunen. Sommigen ondersteunen document.all[] en anderen weer document.layers[].
Men kan met een if statement checken welke van de 3 gebruikt moet worden door de browser.

if(document.getElementById)
{
//Jouw code
}
else if(document.all)
{
//Jouw code
}
else if(document.layers)
{
//Jouw code
}

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Alex) schreef op zondag 27 april 2008 @ 04:38:
Een identifier moet beginnen met een letter, als ik het me goed herinner. "1" is ongeldig", "p1" is geldig.
Daar zat ik ook aan te denken. Echter liep ik daarbij tegen mijn eigen onwetendheid aan mbt JavaScript. Namelijk wanneer ik p1 ipv 1 zou gebruiken, dan wist ik niet hoe ik via een loop langs de elementen heen kon gaan. Namelijk dan zou ik de string "p" moeten concatonaten met een numerieke variabele. Ik weet hoe dat in PHP moet, maar niet in JavaScript.
Dit is hoe ik het in PHP gedaan zou hebben, maar dat werkt niet in JavaScript denk ik:

document.getElementById("p".$mijnVariabele);

Ook heb ik het volgende stukje code geprobeerd te gebruiken in de functie. Echter werkte het niet en kreeg ik een error. Ik heb nog niet met zekerheid kunnen achterhalen waarom dat is, maar ik vermoed dat wanneer removeChild op alle objecten/divs wordt toegepast, dat alle objecten dan gewoon verwijderd zijn uit de DOM en niet meer met appendChild toegevoegd kunnen worden.

code:
1
2
3
4
5
    for(i=1; i<=numberOfPages; i++){
        document.getElementById('content').removeChild(document.getElementById(i));
    }   
    
    document.getElementById('content').appendChild(document.getElementById(paginaNr));

[ Voor 6% gewijzigd door Arcane Apex op 27-04-2008 06:28 ]


  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Concationation in JavaScript heb ik onderhand ook weten te vinden.
Het kon simpelweg alsvolgt:

document.getElementById('p'+mijnNumeriekeVariabele);

Dan rest alleen nog het probleem van removeChild en appendChild en daarnaast vraag ik me ook af wat het verschil is tussen appendChild en addChild. Ik heb op google nauwelijks informatie kunnen vinden over addChild().

[ Voor 15% gewijzigd door Arcane Apex op 27-04-2008 05:45 ]


  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Mm, dit zal zo niet werken: je haalt nu eerst alle elementen uit je DOM, om daarna een element wat je al hebt weggehaald, opnieuw toe te voegen. Precies wat je al zei

Bovendien hoef je helemaal niet met de DOM te gaan rommelen hiervoor, een beetje CSS is meer dan genoeg:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<html>
<head></head>

<body>

<div id="menu">
    <span onclick="changePage(1);">button01</span>
    <span onclick="changePage(2);">button02</span>
    <span onclick="changePage(3);">button03</span>
</div>
<div id="content">
    <div id="p1">
        Page 1
    </div>
    <div id="p2">
        Page 2
    </div>
    <div id="p3">
        Page 3
    </div>
</div>

<script type="text/javascript">
var NumberOfPages = 3;    

function changePage(paginaNr)
{
    // Verberg alle divs    
    for(var i = 1; i < numberOfPages; i++){
        document.getElementById("p" + i).style.display = "none";
    }
    
    //Toon de opgevraagde div
    document.getElementById("p" + paginaNr).style.display = "block";
}
</script>
</body>
</html>


Volgens mij zou dit moeten werken. Overweeg trouwens wel om de <span>'s te verwisselen voor <a>'s, aangezien anchor's wel tabbaar zijn en spans niet. Zorg evt. ook voor fallback voor mensen zonder JS :)

We are shaping the future


  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Waarom bouw je het trouwens niet zo dat je niet handmatig de numberOfPages hoeft op te geven? Nu moet je eigenlijk op 2 plekken het zo maken dat je dit moet doen (daadwerkelijk de elementen erin zetten en die variabele aanpassen).

Als je nu de children oppakt van de content div en daar doorheen loopt. Dan maakt het niet uit hoeveel je erin hebt staan, maar dan doet die loop het werk, zodat je die variabele niet in hoeft te stellen. Meer failsafe en mocht je je appendChild en removeChild wat uitgebreider gaan gebruiken nog makkelijker ook.

Verwijderd

Arcane Apex schreef op zondag 27 april 2008 @ 05:11:
Ik heb het opgelost. Niet alle browsers schijnen document.getElementById() te ondersteunen. Sommigen ondersteunen document.all[] en anderen weer document.layers[].
Men kan met een if statement checken welke van de 3 gebruikt moet worden door de browser.
Toen ik dit las moest ik heel even kijken of ik niet een thread uit 2001 zat te lezen ;) Vergeet document.all en document.layers al helemaal. Er is nu echt geen reden meer om dat te gebruiken.

  • Joen
  • Registratie: Juli 2003
  • Laatst online: 02-10 12:57
Verander eens
code:
1
changePage(1);

naar
code:
1
changePage('1');

(en voor de andere nummers natuurlijk de 1 vervangen...

Je doet nu een aanroep met een getal wat ook als getal wordt gezien terwijl je een div-layer met een getal wat als tekst wordt gezien aan wilt spreken.

  • MrDummy
  • Registratie: April 2000
  • Laatst online: 25-07 12:00

MrDummy

Nog steeds gek op anime...

En in IE moet name en id niet ergens gelijk zijn. Alle benamingen moeten uniek zijn. Firefox heeft geen probleem mee, maar IE heeft wel kritiek op. Door alles met unieke naam te geven werkt IE dan prima zonder foutmelding.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 09:49

Bosmonster

*zucht*

Joen schreef op zondag 27 april 2008 @ 22:26:
Verander eens
code:
1
changePage(1);

naar
code:
1
changePage('1');

(en voor de andere nummers natuurlijk de 1 vervangen...

Je doet nu een aanroep met een getal wat ook als getal wordt gezien terwijl je een div-layer met een getal wat als tekst wordt gezien aan wilt spreken.
Sinds wanneer is javascript type-safe? Volgens mij converteert is alles on-the-fly en zou dit geen problemen op mogen leveren.

[ Voor 9% gewijzigd door Bosmonster op 28-04-2008 14:49 ]


  • Joen
  • Registratie: Juli 2003
  • Laatst online: 02-10 12:57
Dit ontdekte ik sinds ik uit een tekstuele 10 plus het cijfer 1 er bij opgeteld het cijfer 101 kreeg ipv 11.
Met parseInt() kon ik die 10 naar een daadwerkelijk cijfer 10 omzetten. Daar vanuit gaande denk ik dat je dus ook secuur moet zijn in het type data in functie-aanroepen.

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Alex) schreef op zondag 27 april 2008 @ 05:55:
Bovendien hoef je helemaal niet met de DOM te gaan rommelen hiervoor, een beetje CSS is meer dan genoeg:
Dat heeft enorm geholpen. Bedankt!

Ik vraag me nog wel steeds af dat wanneer men probeert een DOM node te verwijderen met removeChild(), hoe men dan diezelfde node weer kan toevoegen. In feite haalt men dus content weg, maar om dat weer toe te voegen lijkt het me dat die content zich nog ergens moet bevinden zodat het weer aan de DOM toegevoegd kan worden mbv addChild() of appendChild().
Heeft iemand enig idee hoe je dit kan doen?

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Niet :)

Met removeChild gooi je iets ook echt uit de DOM. De enige manier om het terug te krijgen, is een kopie maken en die weer invoeren.

Maar waarom je dát zou willen :?

We are shaping the future


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Arcane Apex schreef op dinsdag 29 april 2008 @ 13:28:
Ik vraag me nog wel steeds af dat wanneer men probeert een DOM node te verwijderen met removeChild(), hoe men dan diezelfde node weer kan toevoegen.
Ik heb het even te druk om te testen, maar removeChild (ook onder MS implementatie) geeft volgens mij de verwijderde node terug; die reference kun je natuurlijk wel vasthouden om daarna weer ergens anders te inserten lijkt me.

[ Voor 32% gewijzigd door RobIII op 29-04-2008 14:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
RobIII schreef op dinsdag 29 april 2008 @ 14:02:
[...]


[...]

Ik heb het even te druk om te testen, maar removeChild (ook onder MS implementatie) geeft volgens mij de verwijderde node terug; die reference kun je natuurlijk wel vasthouden om daarna weer ergens anders te inserten lijkt me.
Ahja, je hebt gelijk.
Return Value

Returns a reference to the object that is removed.
Dan zou het mogelijk moeten zijn :)

We are shaping the future


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Alex) schreef op dinsdag 29 april 2008 @ 14:06:
Dan zou het mogelijk moeten zijn :)
The removed child node still exists in memory, but is no longer part of the DOM. You may reuse the removed node later in your code, via the oldChild object reference.
Lijkt me wel dus :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:01

crisp

Devver

Pixelated

Sterker nog: om een node te verplaatsen hoef je niet eens eerst een removeChild te doen, een appendChild van een node die zich al ergens anders in de documenttree bevind is feitelijk al een move ;)

Intentionally left blank


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
crisp schreef op dinsdag 29 april 2008 @ 16:42:
Sterker nog: om een node te verplaatsen hoef je niet eens eerst een removeChild te doen, een appendChild van een node die zich al ergens anders in de documenttree bevind is feitelijk al een move ;)
:D OMG. Je wil niet weten hoeveel code nu een stomme constructie bevat omdat dit nog nooit in me opgekomen is om te proberen... En mierenneukert als ik ben of kan zijn moet ik natuurlijk die overtolligheid nu overal uit gaan slopen :X :D

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:01

crisp

Devver

Pixelated

RobIII schreef op dinsdag 29 april 2008 @ 16:45:
[...]

:D OMG. Je wil niet weten hoeveel code nu een stomme constructie bevat omdat dit nog nooit in me opgekomen is om te proberen... En mierenneukert als ik ben of kan zijn moet ik natuurlijk die overtolligheid nu overal uit gaan slopen :X :D
Daarom noem ik het nog maar eens, veel mensen weten het niet ;)

Intentionally left blank

Pagina: 1