[JS] ID mag niet met int beginnen?!

Pagina: 1
Acties:

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
Ik heb een functie geschreven om verschillende elementen te verbergen voor gebruikers die er geen authorisatie voor hebben.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Inhoud functie om HTML element te verbergen
    if (document.all) //IE only 
    {
        for (x in document.all)
        // loop trough all HTML elements
        {
            var currentID = document.all[x].id;
            if ((currentID != undefined) && (currentID.indexOf('a') != -1))
            {
                //if ID of current element contains the usertype character, it`s hidden
                eval("document.all." + currentID + ".style.visibility = 'hidden'");
            }
        }
    }

//HTML element dat WEL word verborgen
<a href="#" id="abc">test</a>

//HTML element dat NIET word verborgen
<a href="#" id="1abc">test</a>


En het vreemde is dat de functie prima werkt , behalve als ik het id van de link laat beginnen met een nummer, bijvoorbeeld: id="1abc". Dan krijg ik een foutmelding dat er ";" ontbreekt in de eval-regel. :?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

klopt, een id mag niet met een cijfer beginnen.
Verder vraag ik me af waarom je gebruik maakt van document.all (IE-only) en eval (onnodig)

Intentionally left blank


  • André
  • Registratie: Maart 2002
  • Laatst online: 00:33

André

Analytics dude

Je kunt beter getElementsByTagname("a") gebruiken :)

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
ooo, ik wist niet eens dat een id niet met een cijfer mocht beginnen... raar dat ik daar nu pas tegen aan loop. Is er trouwens een goede reden voor waarom die niet met een cijfer mag beginnen? Vind het een rare restrictie....

Ik gebruik document.all omdat we alleen IE ondersteunen (niet mijn keus maar goed)

En je bedoelt dat ik beter dit kan gebruiken:
JavaScript:
1
document.all[x].style.visibility = 'hidden';

[ Voor 18% gewijzigd door CaptBiele op 14-05-2004 08:17 ]


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
André schreef op 14 mei 2004 @ 08:10:
Je kunt beter getElementsByTagname("a") gebruiken :)
Ik dacht dat er iets met getElementsByTagname was.. Ik heb iets in mijn achterhoofd zitten dat ik die niet moest gebruiken... weet alleen niet meer waarom :P

Maar verder moet ik ook controleren of het character VOORKOMT in de naam.

Verwijderd

Doe het dan gewoon zo, is nog een stuk korter ook:

JavaScript:
1
2
3
4
5
6
aas = document.getElementsByTagName('A'); i = aas.length;
while (i--) {
    currentID = aas[i].id;
    // Hier komt je check te staan op currentID te staan
    aas[i].style.visibility = 'hidden';
}

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
Verwijderd schreef op 14 mei 2004 @ 08:24:
Doe het dan gewoon zo, is nog een stuk korter ook:

JavaScript:
1
2
3
4
5
6
aas = document.getElementsByTagName('A'); i = aas.length;
while (i--) {
    currentID = aas[i].id;
    // Hier komt je check te staan op currentID te staan
    aas[i].style.visibility = 'hidden';
}
Het werkt ook nog ;)

Dat ziet er wel kewl uit, maar ik vind het een vage functie. Die functie is er voor om een array met bepaalde elementen terug te krijgen zoals table-elementen of zo. En nu krijg ik ook de elementen terug waarbij de letter 'A' (en 'a') voorkomt in het ID van het element.
Dus deze zoekt in de id en tagname van een element? (en is case-insensitive)
waarom verdwijnen dan niet alle anchors als ik op 'a' zoek?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:01

Janoz

Moderator Devschuur®

!litemod

CaptBiele schreef op 14 mei 2004 @ 08:12:
Is er trouwens een goede reden voor waarom die niet met een cijfer mag beginnen? Vind het een rare restrictie....
Doordat een variabele naam niet met een cijfer mag beginnen kan een parser veel makkelijker het onderscheid maken tussen een constante (getal) en een variabele (letters). Zou een variabele met een getal kunnen beginnen dan weet de parser pas wat hij aan het lezen is als hij een letter of whitespace of operatie tegen komt.

De restrictie zorgt er dus voor dat je geen lookahead parser nodig hebt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

CaptBiele schreef op 14 mei 2004 @ 08:44:
Dat ziet er wel kewl uit, maar ik vind het een vage functie. Die functie is er voor om een array met bepaalde elementen terug te krijgen zoals table-elementen of zo. En nu krijg ik ook de elementen terug waarbij de letter 'A' (en 'a') voorkomt in het ID van het element.
Dus deze zoekt in de id en tagname van een element? (en is case-insensitive)
waarom verdwijnen dan niet alle anchors als ik op 'a' zoek?
Nee, bijvoorbeeld <td id="a"> wordt niet gematched hierdoor, het gaat echt om de tagname A. Zou je op de kleiner letter a zoeken werkt het ook, dus niet casesensitive idd. Anchors verdwijnen als het goed is ook door deze functie, als je verder niets toevoegt.

[ Voor 5% gewijzigd door Verwijderd op 14-05-2004 08:48 ]


Verwijderd

Ik ben persoonlijk niet zo'n grote voorstander van het misbruik van de collectie getElementsByTagname op deze manier.

De voorbeelden zoals hier geplaatst voorkomen wel het gebruik van eval maar leveren onnodige overhead op omdat er een do while wordt uitgevoerd terwijl het element qua id al bekend is.

Als je zulke scripting op bijv. een grid gaat toepassen op elke row, dan schiet de cpu usage bij de gebruiker bij mouseovers naar de top. Iets wat je niet graag wilt op langzame clients.

Verwijderd

Verwijderd schreef op 14 mei 2004 @ 08:49:
De voorbeelden zoals hier geplaatst voorkomen wel het gebruik van eval maar leveren onnodige overhead op omdat er een do while wordt uitgevoerd terwijl het element qua id al bekend is.
De while loop door de anchor collectie gaat toch echt sneller dan zijn for loop door de complete document.all...

  • André
  • Registratie: Maart 2002
  • Laatst online: 00:33

André

Analytics dude

CaptBiele schreef op 14 mei 2004 @ 08:00:
Ik heb een functie geschreven om verschillende elementen te verbergen voor gebruikers die er geen authorisatie voor hebben.
Om hier nog op terug te komen: zoiets doe je server-side zodat mensen er helemaal niet bij kunnen. Nu kunnen ze in de source alsnog alles zien, en met wat js in de adresbalk kunnen ze ook nog alles tevoorschijn halen.

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
Janoz schreef op 14 mei 2004 @ 08:45:
[...]

Doordat een variabele naam niet met een cijfer mag beginnen kan een parser veel makkelijker het onderscheid maken tussen een constante (getal) en een variabele (letters). Zou een variabele met een getal kunnen beginnen dan weet de parser pas wat hij aan het lezen is als hij een letter of whitespace of operatie tegen komt.

De restrictie zorgt er dus voor dat je geen lookahead parser nodig hebt.
Dit is een heldere en duidelijke uitleg. Nu vergeet ik het nooit meer.... :*)

Verder denk ik niet dat ik getElementsByTagname() kan gebruiken, want ik wil alle elementen, en niet alleen anchors, verbergen.

Verwijderd

CaptBiele schreef op 14 mei 2004 @ 08:55:
Verder denk ik niet dat ik getElementsByTagname() kan gebruiken, want ik wil alle elementen, en niet alleen anchors, verbergen.
Ah ik zie nu idd pas wat je bedoeling was, daar is getElementsByTagName idd niet voor geschikt. :) En toch zou ik het op een nettere manier dan met document.all doen..

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
André schreef op 14 mei 2004 @ 08:54:
[...]
Om hier nog op terug te komen: zoiets doe je server-side zodat mensen er helemaal niet bij kunnen. Nu kunnen ze in de source alsnog alles zien, en met wat js in de adresbalk kunnen ze ook nog alles tevoorschijn halen.
grrr. Als dit echt mogelijk is dan moet ik het op een andere manier doen :(
Ehm, ik zit ff te denken aan een combinatie met ASP, maar de visibility='hidden' blijft natuurlijk altijd zichtbaar.....
Verwijderd schreef op 14 mei 2004 @ 08:58:
[...]
Ah ik zie nu idd pas wat je bedoeling was, daar is getElementsByTagName idd niet voor geschikt. :) En toch zou ik het op een nettere manier dan met document.all doen..
ja sorry, ik had eerst ff niet in de gaten dat het om de 'a' van <a> ging in plaats van de 'a' van id="abc" :+

  • André
  • Registratie: Maart 2002
  • Laatst online: 00:33

André

Analytics dude

CaptBiele schreef op 14 mei 2004 @ 09:02:
[...]


grrr. Als dit echt mogelijk is dan moet ik het op een andere manier doen :(
Ehm, ik zit ff te denken aan een combinatie met ASP, maar de visibility='hidden' blijft natuurlijk altijd zichtbaar.....
Zoek maar eens een id op van een element dat onzichtbaar is en type het volgende in de adresbalk:

code:
1
javascript:document.getElementById("idvandiv").style.visibility="visible"

Verwijderd

CaptBiele schreef op 14 mei 2004 @ 09:02:
Ehm, ik zit ff te denken aan een combinatie met ASP, maar de visibility='hidden' blijft natuurlijk altijd zichtbaar....
Als ASP ook een optie is, warom laat je dan niet gewoon de links helemaal weg :? Serverside zoiets afhandelen is de enige veilige manier.

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
André schreef op 14 mei 2004 @ 09:10:
[...]

Zoek maar eens een id op van een element dat onzichtbaar is en type het volgende in de adresbalk:

code:
1
javascript:document.getElementById("idvandiv").style.visibility="visible"
Als ik dat doe, zie ik alleen de text visible. Maar ik geloof wel dat het kan ja.....

grr, dan moet ik het maar in ASP doen.
Dan pleur ik alle functies in een MySQL tabel, en ga ik die uitlezen. Wordt alleen mijn code een beetje onoverzichtelijker van..... maar veiligheid voor alles

  • André
  • Registratie: Maart 2002
  • Laatst online: 00:33

André

Analytics dude

CaptBiele schreef op 14 mei 2004 @ 09:22:
[...]


Als ik dat doe, zie ik alleen de text visible. Maar ik geloof wel dat het kan ja.....

grr, dan moet ik het maar in ASP doen.
Dan pleur ik alle functies in een MySQL tabel, en ga ik die uitlezen. Wordt alleen mijn code een beetje onoverzichtelijker van..... maar veiligheid voor alles
Hele belangrijke regel is:

Never trust user input.

Dus alles wat een user clientside kan moet je zien te voorkomen. Een client-side form validatie bijvoorbeeld kan wel maar zal ook nog een keer server-side gedaan moeten worden.

Verwijderd

Verwijderd schreef op 14 mei 2004 @ 08:51:
[...]
De while loop door de anchor collectie gaat toch echt sneller dan zijn for loop door de complete document.all...
Ik zag het al, had niet goed de code bekeken :) Ging er vanuit dat er een specifiek element via een collectie werd opgezocht :)

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

Janoz schreef op 14 mei 2004 @ 08:45:
[...]

Doordat een variabele naam niet met een cijfer mag beginnen kan een parser veel makkelijker het onderscheid maken tussen een constante (getal) en een variabele (letters). Zou een variabele met een getal kunnen beginnen dan weet de parser pas wat hij aan het lezen is als hij een letter of whitespace of operatie tegen komt.

De restrictie zorgt er dus voor dat je geen lookahead parser nodig hebt.
Vraagje ( tis al een tijdje geleden dat ik parser kennis heb gehad dus kan verkeerd zitten ) maar het lijkt me toch zeer onwaarschijnlijk dat een Javascript parser geen LALR parser is? Ik heb er nog wel even de ECMA-262 referentie bijgepakt, en daar staat dat een Identifier de volgende syntax heeft:
Syntax
Identifier ::

IdentifierName but not ReservedWord

IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart

IdentifierStart ::
UnicodeLetter
$
_
\ UnicodeEscapeSequence

IdentifierPart ::
IdentifierStart
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation
\ UnicodeEscapeSequence

UnicodeLetter
any character in the Unicode categories “Uppercase letter (Lu)”, “Lowercase
“Modifier letter (Lm)”, “Other letter (Lo)”, or “Letter number (Nl)”.
Impliceert dat laatste niet dat je wel gewoon een letter mag gebruikel als Identier start?

"You're only as good, as what you did last week."


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
nee lijkt mij niet. Er staat nergens dat er een integer/number gebruikt mag worden....
Pagina: 1