Avatar billede mtrolle Nybegynder
03. juni 2005 - 15:30 Der er 22 kommentarer og
3 løsninger

getElementBy flere name

Hej.

Jeg har brug for at sætte 2 til 4 display=none / block.
Tænkte jeg kunne gøre dette via name="highlightsDescription" og document.getElementsByName('highlightsDescription').style.display='none';

Det kan man bare ikke. Så kan man tilgengæld gøre således:
document.getElementsByName('highlightsDescription')[0].style.display='none';
Så vises den første ikke. Men nu har jeg altså 2 til 4 stykker.

Tænker så en funktion må kunne gøre det for mig og gør derfor således:
<script language="JavaScript">
function highlightsMinimizer(todo) {
    i = 0;
    while(i<4) {
        document.getElementsByName('highlightsDescription')[i].style.display=todo;
        i++;
    }
}
</script>

Det virker bare heller ikke :)
Hvad skal jeg dog gøre?
Avatar billede davidfossil Nybegynder
03. juni 2005 - 15:35 #1
Et skud i tågen:

<script language="JavaScript">
function highlightsMinimizer(todo) {
    i = 0;
    var myElements = document.getElementsByName('highlightsDescription');
    while(i<myElements.length) {
        myElements[i].style.display=todo;
        i++;
    }
}
</script>
Avatar billede davidfossil Nybegynder
03. juni 2005 - 15:37 #2
Man kunne måske også flette en if() sætning ind i løkken der checker om myElements[i] er null eller undefined...?
Avatar billede mtrolle Nybegynder
03. juni 2005 - 16:14 #3
Virker ikke :(
Avatar billede mtrolle Nybegynder
03. juni 2005 - 16:39 #4
Gør dig klar til at smide et svar, tror det virker nu :)
Avatar billede mtrolle Nybegynder
03. juni 2005 - 17:28 #5
Det virker i Safari på min Mac, men ikke i IE på min PC.
Det virker yderlige godt nok i FireFox på min mac.
Avatar billede davidfossil Nybegynder
03. juni 2005 - 17:47 #6
svar.

Hvor fejler den i IE?
Avatar billede mtrolle Nybegynder
03. juni 2005 - 18:03 #7
Den melder ikke fejl. Den ændre bare ikke noget. Her gjort således:

function highlightsMinimizer(todo) {
    if(todo == \'hide\') {
        document.getElementById(\'highlightsMinimizerIcon\').style.display=\'none\';
        document.getElementById(\'highlightsMaximizerIcon\').style.display=\'inline\';
        set = \'none\';
    } else {
        document.getElementById(\'highlightsMinimizerIcon\').style.display=\'inline\';
        document.getElementById(\'highlightsMaximizerIcon\').style.display=\'none\';
        set = \'inline\';
    }
    i = 0;
    var myElements = document.getElementsByName(\'highlightsDescription\');
    while(i<myElements.length) {
        myElements[i].style.display=set;
        i++;
    }
    highlightsShow(\'highlightsShowIcon\');
}

(Udkommenteringerne er til for PHP's skyld)
Avatar billede olebole Juniormester
03. juni 2005 - 19:18 #8
<ole>

Noget tyder på, du laver fejl andre steder. Prøv, at lade os se et link

/mvh
</bole>
Avatar billede mtrolle Nybegynder
03. juni 2005 - 20:39 #9
http://new.ontv.dk
Det er de featured programmer der er i toppen (to grå bokse).
Det driller mig helt vildt med nogle sessions i php lige nu, men det har jo ikke noget med javascript delen at gøre...
Avatar billede mtrolle Nybegynder
03. juni 2005 - 20:43 #10
Btw er det det lille minus tegn i øverste højre hjørne i indholdsdelen der ikke virker. Korrekt. Den skal minimere de to bokse så beskrivelse og evt. billeder fjernes.
Avatar billede olebole Juniormester
03. juni 2005 - 21:21 #11
Det virker jo godt nok i Firefox, men det skyldes en af dennes bugs ... det må ikke fungere. Det er ikke tilladt at bruge name-attribut på en TD  ;o)

Du bør i øvrigt slette alle dine XHTML-tag-lukninger (de dér -> ' />'). Det er ikke valid HTML  :)
Avatar billede mtrolle Nybegynder
03. juni 2005 - 21:33 #12
Jeg skal have oversat det en dag... HTML-delen virker alligevel jo ;)

Hvordan fixer jeg det uden brug af name?
Det må kun lade sig gøre at bruge en fællesbetegnelse på nogle forskellige typer? Ellers må jeg indsætte et div, men kan det passe det ikke er muligt uden?
Avatar billede olebole Juniormester
03. juni 2005 - 21:41 #13
Du kan jo give dem en klasse eller udvide deres klasse med en ekstra - og så kikke efter den:
    <td class="minKlasse minSpecialKlasse" ........>

Derefter kan du lave et array med:
    var a = OBJECT.getElementsByTagName("td");
    for (var i=0; i<a.length; i++) {
        if (a[i].className.indexOf("minSpecialKlasse")!=-1) {
            alert("GotYa!");
        }
    }

Objektet 'OBJECT' kan være document, hvorved du leder mellem alle TD'er i dokumentet - men du kunne også indsnævre søgningen ved at lade det være et element ... f.eks. et div eller en tabel:
    var a = document.getElementById("HvadVedJeg").getElementsByTagName("td");
Avatar billede mtrolle Nybegynder
03. juni 2005 - 21:44 #14
Nu har jeg lagt det i en div i stedet og det virker stadig ikke... nu kommer der bare en underlig fejlmeddelelse.
Avatar billede olebole Juniormester
03. juni 2005 - 21:46 #15
Naturligvis, for du kan heller ikke bruge name-attribut på div-elementer  :)
Avatar billede olebole Juniormester
03. juni 2005 - 21:47 #16
Du kan se her, hvad du kan bruge de forskellige attributter på:
    http://www.w3.org/TR/html401/index/attributes.html
Avatar billede mtrolle Nybegynder
04. juni 2005 - 01:20 #17
Ej hvor er det tarveligt :)
Man kan ikke lave samme funktion bare med id i stedet vel? (Der er noget om man ikke må have to tags med ens id.)
Kan man gøre det med class i stedet så?
Avatar billede roenving Novice
04. juni 2005 - 13:44 #18
Man kan sagtens have flere classes på et et element (adskilt med mellemrum !-) og en class behøver ikke optræde i et stylesheet, så der er en mulighed for at lave noget fiksfakseri ved at benytte sig af classNames, hvilket oles eksempel også præcis gør !-)

-- en generaliseret funktion kunne være sådan:

<script language="javascript" type="text/javascript">
function getElementsByClassName(c,t,e){
  switch(getElementsByClassName.arguments.length){
    case 0:
      return null;
    case 1:
      t = '*';
      e = document;
      break;
    case 2:
      e = document;
  }
  var r = new Array(),tags = e.getElementsByTagName(t);
  for(i=0;tags.length>i;i++){
    if(tags[i].className.indexOf(c) > -1)r[r.length] = tags[i];
  }
  return (r.length>0)?r:null;
}
</script>

-- så kunne du bruge den sådan:

var elms = getElementsByClassName('minKlasse','div');
for(i=0; elms.length>i; i++){
  elms[i].style.display = 'none';
}

-- og lave diverne således:

<div class="main minKlasse">
<!-- Så du i dit stylesheet kan benytte .main som selektor -->
</div>
Avatar billede mtrolle Nybegynder
05. juni 2005 - 18:35 #19
Okay, ud fra dit roenving og lidt andet :)
function highlightsMinimizer(todo) {
    if(todo == \'hide\') {
        document.getElementById(\'highlightsMinimizerIcon\').style.display=\'none\';
        document.getElementById(\'highlightsMaximizerIcon\').style.display=\'inline\';
        set = \'none\';
    } else {
        document.getElementById(\'highlightsMinimizerIcon\').style.display=\'inline\';
        document.getElementById(\'highlightsMaximizerIcon\').style.display=\'none\';
        set = \'inline\';
    }
    i = 0;
    var elms = getElementsByTagName(\'div\');
    for(i=0; elms.length>i; i++){
        if(elms[i].className == \'highlightsDescription\') {
            elms[i].style.display = set;
        }
    }
   
    window.open(\'/cookie.php?action=highlights_minimizer&todo=\'+todo,\'Gem\',\'height=10,width=20\');
    highlightsShow(\'highlightsShowIcon\');
}

Men det virker ikke... Nogen der ved hvorfor?
Har lagt det op, melder en object expected
Avatar billede mtrolle Nybegynder
05. juni 2005 - 18:43 #20
hov, arh dumme mig :)
Mangler lige et document. :)

roenving og olebole, smid et svar, så får I alle 15 point hver ;)
Avatar billede olebole Juniormester
05. juni 2005 - 20:15 #21
- gerne  ;o)
Avatar billede olebole Juniormester
05. juni 2005 - 20:24 #22
Min egen standard-wrapper (roenving har vist set nogen af mine dokumenter og kender min vane med en blok af egne wrappers) ser nogenlunde sådan ud:


function getElmsByClassName(o,c){var a=[],aa=this.aT(o,"*");for(var i=0,j=aa.length;i<j;i++)if(aa[i].className==c)a.push(aa[i]);return a};

- der typisk bruges sådan:

var o = document.getElementById("etElementID");
myClassArray = getElmsByClassName(o, "minCssKlasse");

- eller:

myClassArray = getElmsByClassName(document, "minCssKlasse");
Avatar billede roenving Novice
06. juni 2005 - 00:08 #23
Tjoh, en enkelt er jeg vel kommet henover, men jeg smed med vilje en forholdvis generel generisk ting !-)

-- els velbekomme '-)
Avatar billede roenving Novice
06. juni 2005 - 00:10 #24
-- og en af de problemer, jeg har overskuet i mine senere udgaver er præcis den, som tidligere er vist med, at der kan være flere classNames i en class, hvorfor man må teste med .indexOf()>-1 !-)
Avatar billede roenving Novice
08. juni 2005 - 01:29 #25
-- og tak for point ;~}
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