Avatar billede lsolesen Nybegynder
19. april 2004 - 12:31 Der er 16 kommentarer og
2 løsninger

Få fat i div'er med prefix i id'et

Jeg har lige læst en god artikel på <http://www.digital-web.com/columns/keepitsimple/separating_behavior_and_structure.shtml>

Det vil jeg også tænkte jeg. Jeg har på:

<http://www.legestue.net/test.html>

Lavet noget, hvor der kommer en lille menubar frem, når man kører over et div-felt. Det er imidlertid lavet med inline-eventhandlers, og det vil jeg inspireret af ovenstående artikel gerne undgå.

Jeg har derfor brug for at få at vide, hvordan jeg kan loope gennem alle div'er med et særligt id-prefix, så jeg kan skjule dem, og lave nogle onmouseoverevents netop på dem.
Avatar billede lsolesen Nybegynder
19. april 2004 - 12:32 #1
Avatar billede grunken Nybegynder
19. april 2004 - 13:09 #2
er det sådan her omtrent du mener ?

<script type="text/javascript">
window.onload = function findivs(){
elm = document.getElementsByTagName('DIV')

for (i=0;i<elm.length;i++){
  if(elm[i].id.indexOf("mitPrefix")!=-1){
  elm[i].onmouseover = new Function("alert('helledusseda')");
  }
}
}
</script>

<div id="mitPrefix1">hejsa</div>
<div id="mitPrefix2">weee</div>
<div id="mitPrefix2">davser</div>
<div id="ikkePrefix2">dooo</div>
Avatar billede roenving Novice
19. april 2004 - 15:30 #3
Den skal måske endda strammes til:

  if(elm[i].id.indexOf("mitPrefix")==0){

-- når det nu er et prefix !-)
Avatar billede grunken Nybegynder
20. april 2004 - 12:18 #4
hehe, selvfølgelig har du ret roenving :o)

Jeg prøver at bruge lidt tid på at finde ud af hvad prefix egentligt betyder :o)
Avatar billede roenving Novice
20. april 2004 - 12:22 #5
Eller måske suffix *rotflmao*
Avatar billede lsolesen Nybegynder
20. april 2004 - 13:29 #6
Det er netop sådan noget jeg søger efter. Egentlig skal onmouseover lyse et underelement til den aktuelle div op. Fx skal man, når man kører musen henover

<div id="element[tal]">
<ul id="adminbar[sammetal]"></ul>
</div>

Lyse adminbaren til elementet op. Jeg har fået følgende til at virke.

<script type="text/javascript">
window.onload = function findivs(){
elm = document.getElementsByTagName('div')

for (i=0;i<elm.length;i++){
  if(elm[i].id.indexOf("element")==0) {
  elm[i].onmouseover = function() { document.getElementById('adminbar438').style.display = 'inline'; }
    elm[i].onmouseout = function() { document.getElementById('adminbar438').style.display = 'none'; }
  }
}
}
</script>

Spørgsmålet er så, om jeg nu bare kan loope igennem de elementer, der er i den specifikke div, eller jeg simpelthen på en måde blot kan tage nummeret efter prefixet og kyle med?

PS. Jeg kan ikke være sikker på, at der fx kun er en ul!
Avatar billede roenving Novice
20. april 2004 - 13:50 #7
Ved du, at du skal have fat i den første ul ?-)

this.childNodes[0] eller this.childNodes[1] vil give dig <ul>-elementet !-)
Avatar billede lsolesen Nybegynder
20. april 2004 - 13:53 #8
Ja, jeg ved, at jeg skal fat i den første, så jeg prøver lige med childNodes :)
Avatar billede grunken Nybegynder
20. april 2004 - 13:56 #9
eller fræse en for mere igennem :o)

<script type="text/javascript">
window.onload = function findivs(){
elm = document.getElementsByTagName('div')

for (i=0;i<elm.length;i++){
if(elm[i].id.indexOf("element")==0) {
  u = elm[i].getElementsByTagName('ul')
  for(j=0;j<u.length;j++){
  elm[i].onmouseover = new Function("document.getElementById('"+u[j].id+"').style.display = 'inline';")
  elm[i].onmouseout = new Function("document.getElementById('"+u[j].id+"').style.display = 'none';")
  }
}
}
}
</script>
Avatar billede lsolesen Nybegynder
20. april 2004 - 14:03 #10
Super, det virker simpelthen perfekt. Mange tak for hjælpen til jer begge. Smid lige nogle svar :)
Avatar billede roenving Novice
20. april 2004 - 14:14 #11
>>grunk

Hvad er ideen med løkken ?-)

<script type="text/javascript">
window.onload = function findivs(){
  elm = document.getElementsByTagName('div')

  for (i=0;i<elm.length;i++){
    if(elm[i].id.indexOf("element")==0) {
      u = elm[i].getElementsByTagName('ul');
      elm[i].onmouseover = new Function("document.getElementById('"+u[0].id+"').style.display = 'inline';")
      elm[i].onmouseout = new Function("document.getElementById('"+u[0].id+"').style.display = 'none';")
    }
  }
}
</script>

-- og velbekomme '-)
Avatar billede lsolesen Nybegynder
20. april 2004 - 14:34 #12
Hvorfor bruger i new Function("[behavior]") i stedet for bare function() { [behavior] }

I øvrigt var jeg lidt for hurtigt til at sige, at det fungerede. Det var super i Mozilla, men i IE opførte min egen løsning sig helt mærkeligt. Nu har jeg forsøgt at implementere roenvings løsning, men før følgende fejl:

http://www.legestue.net/test.html
Avatar billede grunken Nybegynder
20. april 2004 - 17:16 #13
roenving troede netop at meningen var at der var flere ul's under hver div jvf. kommentar

PS. Jeg kan ikke være sikker på, at der fx kun er en ul!


derfor, men sikkert en stor TYK misforståelse :o)

Isolesen>> Sammenlign din linie mod vores :o)

elm[i].onmouseout = new Function("document.getElementById('"+u[j].id+"').style.display = 'none';")

function () { removeLight(elm[i]); document.getElementById('"+u[0].id+"').style.display = 'none'; }

i din linie vil du ikke kunne hive "udefra kommende" variabler ind i funktionen medmindre at du giver u en stor fed var foran :o)

Forskellen er ellers den samme og det kommer sikkert an på temperament :o)

Men netop derfor får du også den fejl du nu engang får da den ikke kan finde objektet :o)

prøv linien som enten mig eller roenving skrev den :o)
Avatar billede lsolesen Nybegynder
21. april 2004 - 09:07 #14
Grunken -> tak for forklaringen med function() ctr. new Function(). Havde ikke tænkte over det der med variablerne, men det beviser vist bare, at jeg ikke altid tænker :)

Ja, der kan være flere ul, men det er altid den første, der skal fremhæves. Derfor er roenvings løsning uden løkke vel smart nok?

Smid i øvrigt lige et svar!

Det virkede naturligvis, da jeg skrev jeres linie, men så ville jeg lige stoppe en ting mere ind i funktionen, hvor den skulle finde det med elm[], men det virkede ikke uanset om jeg skriver det uden for gåseøjnene eller indeni. Men jeg dummer mig sikkert bare igen?

<script type="text/javascript">
window.onload = function (){
elm = document.getElementsByTagName('div')

for (i=0;i<elm.length;i++){
  if(elm[i].id.indexOf("element")==0) {
    u = elm[i].getElementsByTagName('ul');
        document.getElementById(u[0].id).style.display = "none";
    elm[i].onmouseover = new Function(elm[i] + ".style.backgroundColor='#f4f4f4'; document.getElementById('"+u[0].id+"').style.display = 'inline';");
        elm[i].onmouseout = new Function(elm[i] + ".style.backgroundColor='#fff'; document.getElementById('"+u[0].id+"').style.display = 'none';");

  }
}
}
</script>


http://www.legestue.net/test.html
Avatar billede roenving Novice
21. april 2004 - 14:54 #15
Problemet er at du ikke kan adressere via tankeoverføring ...

elm[i] på tidspunktet for udførelse af funktionen er 'noget', men når så funktionen skal udføres når eventet sker, er der ikke en ting, og den slags objekt-overførsel tror jeg ikke på, men måske:

<script type="text/javascript">
var elm;
window.onload = function (){
elm = document.getElementsByTagName('div')

for (i=0;i<elm.length;i++){
  if(elm[i].id.indexOf("element")==0) {
    u = elm[i].getElementsByTagName('ul');
        document.getElementById(u[0].id).style.display = "none";
    elm[i].onmouseover = new Function("elm["+i+"].style.backgroundColor='#f4f4f4'; document.getElementById('"+u[0].id+"').style.display = 'inline';");
        elm[i].onmouseout = new Function("elm["+i+"].style.backgroundColor='#fff'; document.getElementById('"+u[0].id+"').style.display = 'none';");

  }
}
}
</script>
Avatar billede lsolesen Nybegynder
21. april 2004 - 15:12 #16
Naturligvis. Mange tak for det. Jeg er i hvert fald blevet meget klogere, og nu er det vist lykkes mig at få hevet al min inlinestyling ud i et eksternt stylesheet. Det bliver brugt i et system, som jeg har til at ligge her:

http://www.legestue.net/websites/admin/login.php?username=usenet@legestue.net&password=usenet

Det ses i aktion, når man redigerer den enkelte side. Det har været en stor forbedring at flytte javascripts ud i et eksternt javascript, men jeg ved endnu ikke, om de forskellige scripts (endsige html-markup) er lavet så smart som mulig :o)

Men mange tak for hjælpen i hvert fald. Grunken smid lige et svar, så vil jeg belønne jer så fyrsteligt, som eksperten nu tillader :D
Avatar billede grunken Nybegynder
21. april 2004 - 17:53 #17
Et svar er på kastet :o)
Avatar billede roenving Novice
22. april 2004 - 00:44 #18
-- og tak for points ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I dag 10:21 Ny printer, men hvilken Af mort1 i Printere
I går 19:41 USB på Linux Af Uvanga i Linux
12/0818:26 Hvilken type mus Af mort1 i PC
11/0813:21 ms Forms Af leahcim i Andet software
10/0821:30 Blokeret på Snapchat? Af LineP i Chat & Messaging