02. maj 2003 - 17:36Der er
39 kommentarer og 1 løsning
skifte style på nogle men ikke alle
I sp. http://www.eksperten.dk/spm/347615 blev jeg hjulpet til at finde alle elementer med en bestemt class. Ved hjælp af dette script kan man på en gang skifte egenskaber for alle elementer med denne class. Men jeg vil godt have det til at kunne lidt mere.
I første omgang forsøgte jeg med fem divs: to med class="dyr" der er blå, og tre med class="plante" der er røde. Så kan jeg ved at gå videre med dit script uden videre skifte farve på f.eks. alle med class="plante" og skifte dem tilbage igen. Nemlig med flg.:
<script type="text/javascript"><!-- function getDivsByClassName(cn) { temp = new Array(); arr = document.getElementsByTagName("div"); for (i = 0; i < arr.length; i++) if (arr[i].className == cn) temp[temp.length] = arr[i]; return temp; }
function changeStyle() { divArray = getDivsByClassName("plante"); for (i=0; i<divArray.length; i++) { if (divArray[i].style.backgroundColor != 'green') { divArray[i].style.backgroundColor = 'green'; }else{ divArray[i].style.backgroundColor = 'red' } } } //--></script>
Men hvis nu én af de tre divs med class="plante" i forvejen er grøn, ville jeg godt have at scriptet kunne finde ud af kun at ændre farve på de der ikke er grøn og lade den grønne blive ved at være grøn. Og tilsvarende omvendt når der skal skiftes tilbage igen: hvis en af div'erne med class="plante" er rød og kun to er grønne, skal kun de to grønne skifte tilbage. Jeg har lavet et eksempel her: www.dahr.dk/Web/getElementsByClass.html hvor jeg netop har ladet en af de tre divs med class="plante" i forvejen være grøn. Der kan du se hvad der er galt hvis en af de tre div'er i forvejen har en forkert farve: så skifter den selvfølgelig modsat. Dvs. hvad der er grønt bliver rødt og hvad der er rødt bliver grønt. Men jeg vil godt have scriptet til kun at ændre farve på dem der har forkert farve og bevare farven på dem der har den rigtige.
roenving> I forhold til mit eksempel på www.dahr.dk/Web/getElementsByClass.html hvad er så farvegl, farveaendret og faveny? Der skal jo sættes nogle konkrete farver ind for parametrene. Dit sidste script er magen til det jeg har brugt på den side (det som er givet mit sp.), bort set fra at du lægger farverne op som parametre og så kalkulerer med tre (og ikke bare to) muligheder. Men hvad er egentlig den tredje mulighed?
OK gutter, nu har jeg gjort det enkelt og lavet tre funktioner: én der gør alle div'er med class="plante" grønne, én der skifter farve på én af div'erne med class="plante", og én der gør alle div'er med class="plante" røde. Sådan:
function makeGreen() { divArray = getDivsByClassName("plante"); for (i=0; i<divArray.length; i++) divArray[i].style.backgroundColor = 'green'; }
function makeRed() { divArray = getDivsByClassName("plante"); for (i=0; i<divArray.length; i++) divArray[i].style.backgroundColor = 'red'; }
function changeOne() { if (document.getElementById("skifter").style.backgroundColor == 'green') { document.getElementById("skifter").style.backgroundColor = 'red'; }else{ document.getElementById("skifter").style.backgroundColor = 'green'; } }
I kan stadig se og prøve på wwww.dahr.dk/Web/getElementsByClass.html
Det der nu er poinen, er at lave en funktion der 1) uanset hvilken farve den midterste "plante" har, kan gøre alle "planter" grønne, og 2) uanset hvilken farve den midterste "plante" har fået i mellemtiden, kan skifte dem alle tilbage til rød. Funktionen skal kaldes fra ét link som f.eks.:
<a href="java script:skiftFarve();">Gør alle planter grønne eller gør alle planter røde</a> Derudover bevarer man funktionen changeOne() der skifter farve på den midterste "plante". Pointene forhøjes til 100
phoenixv> problemet er at den samme funktion skal BÅDE gøre alle planter grønne (selv om én i forvejen er grøn) OG gøre alle planter røde igen (selv om en måske er gjort grøn i mellemtiden). Din funktion (og roenving's) - som er den samme som mine på siden nu (se min kommentar 03/05-2003 09:33:22 oven for) gør ENTEN alle planter grønne ELLER alle planter røde (eller hvilken farve man nu vælger), men kan ikke skifte tilbage igen hvis én er anderledes.
- og funktionen skal kunne virke fra det samme kald. dvs. det dur ikke med changeStyle('green') eller tilsvarende som roenving foreslår, for så er man nødt til at vide hvilken farve boksene har. Det skal scriptet selv tage højde for.
roenving> ja de skal kunne skifte begge veje ved klik på det samme link. Min funktion fra før:
function changeStyle() { divArray = getDivsByClassName("plante"); for (i=0; i<divArray.length; i++) { if (divArray[i].style.backgroundColor != 'green') { divArray[i].style.backgroundColor = 'green'; }else{ divArray[i].style.backgroundColor = 'red' } } }
- gør netop det, men kun hvis ALLE har den samme farve. Jeg vil have at selv om én er ændret så skal der alligevel kunne skiftes frem og tilbage ved ét klik. Forstår I?
Synes godt om
Slettet bruger
03. maj 2003 - 16:16#14
Scriptet skal både skifte frem og tilbage på én gang?
Synes godt om
Slettet bruger
03. maj 2003 - 16:17#15
Ok, nu forstår jeg vist. Scriptet skal kunne vha. en funktion skifte først til grøn og så tilbage til rød, eller hvad? Og dem, der allerede er den farve, skal overhovedet ikke berøres af scriptet?
Synes godt om
Slettet bruger
03. maj 2003 - 16:18#16
Så er det vist nemmest at give disse "outsidere" en class for sig selv.
phoenixv> OK ikke på én gang, men ved klik på det samme link. F.eks. kan jeg bruge min funktion fra min sidste kommentar (16:15:54) sådan:
<a href="java script:changeStyle();">Gør alle grønne eller gør alle røde</a>
Men hvis én af de tre røde er blevet ændret til grøn vil den skifte til rød mens de to røde bliver grønne. Scriptet skifter bare til den modsatte farve. Jeg vil have at selv om én farve er modsat så skiftes der alligevel så alle bliver grønne - og tilbage igen til rød.
Synes godt om
Slettet bruger
03. maj 2003 - 16:23#18
Ja, det forstår jeg godt. Men som sagt ville det være klart nemmest, hvis du bare gav de modsatte en anden class.
phoenxv> Jep, det er det det skal. Men jeg kan ikke vide hvilken boks der er ændret, så jeg kan ikke give dem en særlig klasse. Det med farverne er bare et eksempel. I praksis drejer det sig om et forum hvor meddelelserne kun angives med navn og tid for indlægget. Så skal man kunne klikke på en enkelt meddelelse og få den vist i en boks under linjen men navn osv. Men mamn skal også kunne få vist ALLE meddelelser - også selv om én eller to måske allerede er blevet lukket - og på samme måde skal man kunne lukke alle meddelelser selv om nogle enkelte er åbnet. Her har man brug for mindst to funktioner: én der åbner enkelte meddelelser og én der åbner eller lukker alle. Spørgsmålet er om det overhovedet kan lade sig gøre eller om man er nødt til at have én funktion til at åbne alle og én til at lukke alle - det er jo nemt nok. Her drejer det sig ikke om farver men om display='block' eller display='none'
Synes godt om
Slettet bruger
03. maj 2003 - 16:26#21
Du kan jo snyde lidt og i funktionen changeOne give elementet et andet className. Så bliver det jo ikke berørt.
Hov det var noget vrøvl. Læs: Men mamn skal også kunne få vist ALLE meddelelser - også selv om én eller to måske allerede er blevet ÅBNET - og på samme måde skal man kunne lukke alle meddelelser selv om nogle enkelte allerede er LUKKET
Synes godt om
Slettet bruger
03. maj 2003 - 16:28#23
Nu blev jeg forvirret igen (undskyld). Skal man med ét link kunne skiftevis åbne og lukke alle meddelelser?
Egentlig tror jeg slet ikke det kan lade sig gøre at samle begge veje (åbne og lukke) i ét link, når nogle enkelte meddelelser kan være åbnet/lukket. Så jeg er sådan set indstillet på at lave det i to links: "Åbn alle meddelelser" og "Luk alle meddelelser". Men man skal jo aldrig sige aldrig, og hvis nogle af jer har ideen til hvordan det evt. alligevel kunne lade sig gøre, synes jeg det ville være en mere elegant løsning.
Ulempen ved roenvings forslag er jo, at hvis man enkeltvis har åbnet alle meddelelser, giver det ingen effekt at trykke på "åbn"-linket. For jeg tænkte også på den løsning.
roenving>&phoenixv> ja, det kan jeg se. Det er rigtigt at det virker sådan set efter hensigten bort set det tilfælde hvor alle meddelelser er blevet åbnet elller lukket enkeltvis... I kan selv prøve med mit farveeksempel som nu er opdateret: www.dahr.dk/Web/getElementsByClass.html
Tak i alle fald. phoenixv> læg også du et svar, så fordeler jeg point med 75 til roenving og 25 til dig.
Synes godt om
Slettet bruger
04. maj 2003 - 11:46#37
Nej tak. Men jeg synes helt klart, du skal lave to separate knapper, en "Åbn alle" og en "Luk alle". Det andet er bare et irritationsmoment.
Alligevel er det nemmest med en af hver slags knap. For selv hvis man bare har åbnet tre meddelelser, skal man jo trykke to gange for at lukke dem alle igen. Og det er uhensigtsmæssigt, når det kunne gøres med ét klik!
Synes godt om
Ny brugerNybegynder
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.