JS-Problem?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Setzt du die Hintergrundfarbe denn vorher per JavaScript oder steht sie im HTML-Code?

Wenn du .style.background abfrägst, dann prüft das nicht die background-Eigenschaft, die in der CSS-Datei angegeben wurde, sondern die, die im HTML im style-Attribut steht. Diese kann man entweder per JavaScript setzen oder manuell in der HTML-Datei eintragen wie folgt:

<div id="haupt" style="background: rgb(180, 179, 179);">

In diesem Fall würde "Dunkel" rauskommen.

Anmerkung (in diesem Fall zwar unwichtig, aber gut zu wissen): Alles was im Style-Attribut steht überschreibt das, was in der CSS-Datei steht. Wenn in der CSS-Datei beispielsweise "background: red" steht und im style-Attribut "background: green", dann ist das Element grün, denn das style-Attribut hat eine höhere Priorität.

Wenn du wissen willst, welche Eigenschaft per CSS-Datei gesetzt wurde, musst du den computatedStyle verwenden. Das geht wie folgt:

const element = document.getElementById("test");
const cssObj = window.getComputedStyle(element, null);
 
if (cssObj.getPropertyValue("background") === 'rgb(180, 179, 179)') {
  aktiv.innerHTML = '"Dunkel"';
} else {
  aktiv.innerHTML = '"Hell"';
};
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

Lindner12 
Fragesteller
 04.09.2022, 20:39

OK, danke. Also wenn ich das mit computatedStyle mache, was muss ich bei "test" stattdessen einsetzen?

0
Lindner12 
Fragesteller
 04.09.2022, 20:45
@MrAmazing2

Ja, danke. Habe das mal gemacht, aber es kommt immer "Dunkel" raus.

Also ich habe 2 Buttons, die die Hintergrundfarbe ändern. Ich habe bei beiden JS mit onclick eingebunden und beim body onload. Wo ist das Problem? Ich schreibe einen Kommentar mit dem Bild, denn hier kann ich nichts einfügen.

0
MrAmazing2  04.09.2022, 20:46
@Lindner12

Könntest du vlt. den HTML und JS-Code schicken, damit ich es nachstellen kann?

1
Lindner12 
Fragesteller
 04.09.2022, 20:51
@MrAmazing2

(Gute Frage formatiert es manchmal etwas komisch)

Manchmal sind noch weitere JS Funktionen, aber für andere Funktionen.

HTML:

<body id="haupt" onload="backgroundcolor(), activeoff()">
                <h3 class="h4">Design:</h3>

                <div class="Buttons">

                    <div class="dunkel">
                        <button onclick="setBodyColor('#262626'), activeoff()" class="startzwei">
                            Dunkel
                        </button>

                    </div>

                    <button onclick="setBodyColor('rgb(180, 179, 179)'), activeoff()" class="startzwei">
                        Hell
                    </button>

                </div>

                <div>Aktives Design:<span></span><span id="aktiv"><span><span></span></div>
</body>

</html>

JS:

function activeoff(){
    const element = document.getElementById("haupt");
const cssObj = window.getComputedStyle(element, null);
 
if (cssObj.getPropertyValue("background") === 'rgb(180, 179, 179)') {
  aktiv.innerHTML = '"Hell"';
} else {
  aktiv.innerHTML = '"Dunkel"';
};
}
0
Lindner12 
Fragesteller
 04.09.2022, 21:36
@MrAmazing2

Der Code für die Buttons, die die Farbe des Hintergrundes ändern:

<script>
        var bgcolor = '#262626'; /* default */
        function backgroundcolor() {
            if (localStorage["mybgcolor"] != null) { // schon gespeichert
                bgcolor = localStorage.getItem("mybgcolor");
                console.log('load ' + bgcolor);
            } else { // noch nicht gespeichert 
                localStorage.setItem("mybgcolor", bgcolor);
                console.log('saved ' + bgcolor);
            }
            setBodyColor(bgcolor);
        }
        function setColor(abgcolor) { // farbe speichern 
            localStorage.setItem("mybgcolor", abgcolor);
            console.log('saved ' + abgcolor);

        }
        function setBodyColor(mybodycolor) {
            setColor(mybodycolor); // farbe speichern
            document.body.style.backgroundColor = mybodycolor; // body farbe setzen
            console.log('set to background ' + mybodycolor);
        }
    </script>
0
MrAmazing2  04.09.2022, 21:39
@Lindner12
<span id="aktiv"><span>

Der hintere davon muss </span> sein, da hast du den Schrägstich vergessen.

Außerdem sind die zwei anderen span-Elemente da noch komplett unnötig. So reicht es auch:

<div>Aktives Design:<span id="aktiv"></span></div>

Aber zum eigentlichen Problem, mit "background-color" anstatt "background" funktioniert es.

if (cssObj.getPropertyValue("background-color") === 'rgb(180, 179, 179)') {

Wenn du dir mal background ausgeben lässt ( cssObj.getPropertyValue("background") ), siehst du, dass da noch etwas mehr Information enthalten ist: "rgb(180, 179, 179) none repeat scroll 0% 0%". Deswegen hat's nicht geklappt. "background" hingegen ist nur "rgb(180, 179, 179)", da klappt's dann.

1
Lindner12 
Fragesteller
 04.09.2022, 21:43
@MrAmazing2

Ja, das mit den span war noch von einem alten "Projekt". Habe seit dem den Code nicht wirklich überarbeitet. Aber danke, dachte nicht, dass das Problem so einfach zu lösen ist. :)

1
IchMalWiederXY  05.09.2022, 12:31

mmhh:
mich irritieren die "drei" === Operatoren.
Sollten es nicht nur zwei sein ?

0
MrAmazing2  05.09.2022, 12:58
@IchMalWiederXY

Ist ein JavaScript Feature.

JS ist ja normalerweise nicht typsicher. Wenn du dir beispielsweise mal das Ergebnis dieses Vergleichs ausgeben lässt:

console.log( "" == [] );

bekommst du true. Weil eben, wenn der Typ nicht beachtet wird und ein leeres Array und ein leerer String intern das selbe sind. (Ein String ist ja auch nur ein char-Array).

=== prüft auf absolute Gleichheit inklusive Typ.
Eventuell reicht in dem Fall auch ein ==, da müsste man sich anschauen was getPropertyValue so zurückgeben kann. Aber ich würd da auf Nummer sicher gehen und === verwenden.

1