javascript om 2de button van kleur te veranderen

Status
Niet open voor verdere reacties.

Orcaa

Gebruiker
Lid geworden
1 nov 2010
Berichten
125
Heb nu twee rode buttons en als je op een button klikt moet ie groen worden en als je weer klikt weer terug naar rood.
Nu lukt het om de eerste button van kleur te veranderen, maar bij tweede button werkt het niet.

heeft iemand een idee?

Dit is de code:
HTML:
<!DOCTYPE html>
<html>
<head>
 <style>
button {
  height:40px;
  width:160px;
  border: 4px;
  border-radius: 20px 20px 20px 20px;
  border-color:red;
  color: yellow;
  padding: 12px 15px;
  text-align: center;
  font-size: 16px;
  cursor: pointer;
}
.button1 { background: red }

.button1:hover {
  background-color: green;
}

</style>
</head>
 <body onload="beginfase()" style="background-color:#E3CEF6;" >
  
<button  id="bGeneral" onclick="showOrHide('General')" class="button1"  name= "bGeneral" ><b>General</b></button> 
  <!-- Create extra space -->
<p><br></p>	
<!-- The Next Button Plates -->
<button id = "buttonP" onclick="showOrHide('Plates')" class="button1" name= "buttonP" ><b>Plates</b></button> 
  
<script type="text/javascript">
var button = document.querySelector("button");

button.addEventListener("click", function() {
    const curColour = button.style.backgroundColor;

    if (curColour === 'red') {
        button.style.backgroundColor = "green";
    }
    else {
        button.style.backgroundColor = "red";
    }
});

</script>
  </body>
</html>
 
document.querySelector("button") vindt alleen de eerste button.

Je vindt ze allemaal met document.querySelectorAll("button")
maar dan weet je niet op welke button is gedrukt.

Je kan selectief kiezen (# verwijst naar de id van de button)
document.querySelector("#bGeneral")
document.querySelector("#buttonP")


Of je wijst aan welke button je bedoelt, tellend vanaf 0
document.querySelectorAll("button")[0]
document.querySelectorAll("button")[1]
 
Om het universeel te houden kan je er een function van maken.
Code:
.button1 { }
.button1:hover { background-color: green !important; }

<button style="background-color:red;" id="bGeneral" onclick="showOrHide('General')" class="button1" name="bGeneral"><b>General</b></button>
<button style="background-color:red;" id="buttonP"  onclick="showOrHide('Plates')"  class="button1" name="buttonP"><b>Plates</b></button>

<script type="text/javascript">
function AddButtonClickEvent (ButtonID) {
  var button = document.getElementById(ButtonID);
  button.addEventListener("click", function(event) {
    var curColour = this.style.backgroundColor;
    // jouw code wat er moet gebeuren bij een click
  });
}
AddButtonClickEvent ("bGeneral");
AddButtonClickEvent ("buttonP");
</script>

Je kan niet rechtstreeks de opmaak uitlezen als je die in de <style> in de <head> hebt gezet.
Dit lukt wel als je de style in de button zet <button style="background-color: ..." ......>
In dit geval zou :hover niet werken, kan opgelost worden met !important alhoewel ik geen voorstander ben van !important
 
Laatst bewerkt:
dankjewel voor de uitleg.

het is nu een stuk duidelijker
 
Hoi

Ik zit met dezelfde vraag, alleen heb ik 25 buttons, om niet voor elke button een function te schrijven wil ik dit op ongeveer dezelfde manier oplossen als hierboven.
Het lukt mij echter niet (ken javascript niet zo goed..)

vb met 5 buttons:

HTML:
<td data-label="Alert" alt="Alertpng" id="alert1" class="alertmeldingen"><img src="images/alert2.png" onclick="changeAlert()"></td>
HTML:
<td data-label="Alert" alt="Alertpng" id="alert2" class="alertmeldingen"><img src="images/alert2.png" onclick="changeAlert()"></td>
HTML:
<td data-label="Alert" alt="Alertpng" id="alert3" class="alertmeldingen"><img src="images/alert2.png" onclick="changeAlert()"></td>
HTML:
<td data-label="Alert" alt="Alertpng" id="alert4" class="alertmeldingen"><img src="images/alert2.png" onclick="changeAlert()"></td>
HTML:
<td data-label="Alert" alt="Alertpng" id="alert5" class="alertmeldingen"><img src="images/alert2.png" onclick="changeAlert()"></td>

Dit is mijn javascript nu:
Code:
function changeAlert() {
	var image = document.getElementById('alert1');
	if (image.src.match("images/alert2.png")) {
		image.src = "images/alert.png";
	}
	else {
		image.src = "images/alert2.png";
	}
	}
Hoe kan ik dan alle 25 images apart aanklikken (of de 5 voorbeelden in dit geval..)

Mvg
 
querySelector werkt meestal makkelijker dan getElementById. Dan wordt het zoiets.
Code:
<td data-label="Alert" alt="Alertpng" id="alert1" class="alertmeldingen"><img src="images/alert2.png" onclick="changeAlert()"></td>
<td data-label="Alert" alt="Alertpng" id="alert2" class="alertmeldingen"><img src="images/alert2.png" onclick="changeAlert()"></td>
<script>
function changeAlert(td_id) {
    // stel dat td_id="alert1" dan wordt dat hieronder "#alert1 img"
    var image = document.querySelector("#" + td_id + " img");
    if (image.src.match("images/alert2.png")) {
        image.src = "images/alert.png";
    } else {
        image.src = "images/alert2.png";
    }
}
changeAlert("alert1");
changeAlert("alert2");
</script>
 
Dit lijkt toch niet echt te werken bij mij.. nochtans de code gwn overgenomen..

Code:
<td data-label="Alert" alt="Alertpng" class="alertmeldingen" id="alert1"><img src="images/alert2.png" onclick="changeAlert()" style="cursor:pointer;" width="25px" height="25px"></td>
<td data-label="Alert" alt="Alertpng" class="alertmeldingen" id="alert2"><img src="images/alert2.png" onclick="changeAlert()" style="cursor:pointer;" width="25px" height="25px"></td>

function changeAlert(td_id) {
    // stel dat td_id="alert1" dan wordt dat hieronder "#alert1 img"
    var image = document.querySelector("#" + td_id + " img");
    if (image.src.match("images/alert2.png")) {
        image.src = "images/alert.png";
    } else {
        image.src = "images/alert2.png";
    }
}
changeAlert("alert1");
changeAlert("alert2");
 
Vele wegen naar Rome ;) Commentaar staat ertussen.
Code:
<td data-label="Alert" alt="Alertpng" id="alert1" class="alertmeldingen">
<img src="images/alert2.png" onclick="changeAlert(this)" style="cursor:pointer;" width="25" height="25">
</td>
<td data-label="Alert" alt="Alertpng" id="alert2" class="alertmeldingen">
<img src="images/alert2.png" onclick="changeAlert(this)" style="cursor:pointer;" width="25" height="25">
</td>

<script type="text/javascript">
// changeAlert (thisImage) : thisImage is het img object waarop is geklikt
// <img> in de html heeft onclick="changeAlert(this)"
function changeAlert (thisImage) {
    // we gaan uit van alert2, bij de 'if' veranderen we dit eventueel
    var newImgName = "images/alert2.jpg";
    // zoek de positie van de laatste / in de src van de image
    var n = thisImage.src.lastIndexOf("/");
    // als / is gevonden EN als alles erna alert2.jpg is dan wijzigen in alert.jpg
    if (n != -1 && thisImage.src.substr(n + 1) == "alert2.jpg") {
         newImgName = "images/alert.jpg";
    }
    // verander de src
    thisImage.src = newImgName;
}
</script>
 
Ok nu lijkt het wel te werken, waarvoor dank :)
Maar ik heb binnen 1 tabel rij 5 verschillende knoppen(png's), de eerste was die changeAlert (this)

kan ik dezelfde formule gebruiken voor die andere png's ook of moet die (this) dan veranderd worden bij elke png ?
 
Aantal rijen maakt niet uit :D het gaat erom dat je elke td op dezelfde wijze maakt.
Code:
<td data-label="Alert" alt="Alertpng" id="alert[B]XX[/B]" class="alertmeldingen">
<img src="images/alert[B]XX[/B].png" onclick="changeAlert(this)" style="cursor:pointer;" width="25" height="25">
</td>
waarbij XX telkens een uniek getal is.

De Javascript function staat 1 keer in de pagina.

De function weet door this in onclick="changeAlert(this)" op welke afbeelding wordt geklikkt.
 
Ik zie dat ik in mijn vorige vraag niet helemaal duidelijk was, waarvoor mijn excuses.
Even toelichten:

Ik heb dus 25 vragen in mijn tabel, in elk van de vragen zitten 6 verschillende aanklikbare icoontjes (1.alert, 2.notapplicable, 3.checked, 4.error, 5.comment, 6.camera)
De code voor de alert is nu in orde waarvoor mijn dank natuurlijk.
Wat ik mij afvroeg hoe ik eigenlijk hetzelfde moet doen voor de rest van de icoontjes, ik weet dat ik het javascript gedeelte kan recupereren maar het (this) gedeelte
kan ik waarschijnlijk niet bij alle verschillende iconen gebruiken.. ?

Dit is mijn code bij 1 vraag (dit herhaald zich natuurlijk 25 keer):
HTML:
<tr>
<!-- ========== Kolom met nummers ========== -->
	<td data-label="Number" class="tdnr">1</td>
<!-- ========== Kolom met vragen ========== -->
	<td data-label="Question" class="questions">vraag1? <p style="font-size:11px; display:inline;">(tekst)</p></td>
<!-- ========== Kolom met alert uitroepteken ========== -->
	<td data-label="Alert" alt="Alertpng" class="alertkolom" id="alert1"><img src="images/alert2.png" onclick="changeAlert(this)" class="alerticoonclass" style="cursor:pointer;" width="25px" height="25px"></td>
<!-- ========== Kolom met n/a, ok, n.ok 3figuren ========== -->
	<td data-label="Acceptable" class="acceptablemeldingen">
	<img src="images/na2.png" alt="Napng" id="na" class="naicoonclass" onclick="changeNa()" style="cursor:pointer;" width="25px" height="25px">
	<img src="images/checked2.png" alt="Checkedpng" id="checked" class="checkedicoonclass" onclick="changeChecked()" style="cursor:pointer;" width="25px" height="25px">
	<img src="images/error2.png" alt="Errorpng" id="error" class="erroricoonclass" onclick="changeError()" style="cursor:pointer;" width="25px" height="25px">
	</td>
<!-- ========== Kolom met comment en apparaat, foto 2figuren ========== -->
	<td data-label="Comments" class="commentsmeldingen">
	<img src="images/comment2.png" alt="Commentpng" id="comment" class="commenticoonclass" onclick="changeComment()" style="cursor:pointer;" width="22px" height="22px">
	<img src="images/camera2.png" alt="Camerapng" id="camera" class="cameraicoonclass" onclick="changeCamera()" style="cursor:pointer;" width="25px" height="25px">
	</td>
</tr>
 
Laatst bewerkt:
Eerst even dit voordat ik naar je laatste aanvulling kijk.

Een id="..." moet uniek zijn op een pagina en mag dus slechts 1 keer voorkomen.
Een class="...." mag wel meerdere keren voorkomen.

Dit betekent dat in jouw tabel met 25 rijen elke id uniek moet zijn.

Als voorbeeld, dit mag niet
<img src="images/camera1.png" id="camera" class="camera-icoon" />
<img src="images/camera2.png" id="camera" class="camera-icoon" />

Als voorbeeld, dit mag wel
<img src="images/camera1.png" id="camera05" class="camera-icoon" />
<img src="images/camera2.png" id="camera18" class="camera-icoon" />

Meer info over alle attributen
www.w3schools.com/tags/ref_attributes.asp
 
Laatst bewerkt:
Omdat je veel rijen met veel images hebt is het onderstaande handiger.
Bij elke <img> kan je dan de style/width/height weghalen. Zet dit 1x vlak boven </head>
Code:
<style>
.alertkolom img,
.acceptablemeldingen img,
.commentsmeldingen img {
  width: 25px;
  height: 25px;
  cursor: pointer;
}
</style>

Dit is de essentie van 1 rij in de tabel, alles wat je verder nodig hebt kan je er zelf bijzetten.
Daarna kopieer je dit totdat je 25 rijen hebt. Let erop dat overal de id uniek moet zijn.
Code:
<tr>
  <td class="tdnr">1</td>
  <td class="questions">vraag 1? <p style="font-size:11px; display:inline;">(tekst 1)</p></td>
  <td class="alertkolom">
    <img src="images/alert2.png"   alt="" class="alerticoonclass"   onclick="changeImage(this)">
  </td>
  <td class="acceptablemeldingen">
    <img src="images/na2.png"      alt="" class="naicoonclass"      onclick="changeImage(this)">
    <img src="images/checked2.png" alt="" class="checkedicoonclass" onclick="changeImage(this)">
    <img src="images/error2.png"   alt="" class="erroricoonclass"   onclick="changeImage(this)">
  </td>
  <td class="commentsmeldingen">
    <img src="images/comment2.png" alt="" class="commenticoonclass" onclick="changeImage(this)">
    <img src="images/camera2.png"  alt="" class="cameraicoonclass"  onclick="changeImage(this)">
  </td>
</tr>

De Javascript wordt in jouw laatste vraag wat korter, er wordt alleen naar de src gekeken van de <img> waarop is geklikt
Code:
function changeImage (thisImage) {
  // wat is de src van de img waarop is geklikt
  var currentSrc = thisImage.src;
  var newSrc;
  // als de laatste 5 tekens gelijk zijn aan "2.png"
  if (currentSrc.substr(currentSrc.length - 5) == "2.png") {
    // dir/blah2.png  wordt  dir/blah.png
    newSrc = currentSrc.substr(0, currentSrc.length - 5) + ".png";
  } else {
    // dir/blah.png  wordt  dir/blah2.png
    newSrc = currentSrc.substr(0, currentSrc.length - 4) + "2.png";
  }
  thisImage.src = newSrc;
}
 
Dat van unieke ID's en meerdere classes was me dus echt ontgaan! merci voor de opfrissing ;)

Alleen krijg ik het nu niet aan de praat om de icoontjes aan te klikken met je laatste script

Dus mijn iconen hebben nu allemaal een unieke ID van 1 tot 25 (voorbeeld 1 hieronder)
HTML:
<td data-label="Alert" class="alertkolom">
	<img src="images/alert2.png" alt="Alertpng" id="alert1" onclick="changeImage(this)" class="alerticoonclass">
</td>
<!-- ========== Kolom met n/a, ok, n.ok 3figuren ========== -->
<td data-label="Acceptable" class="acceptablemeldingen">
	<img src="images/na2.png" alt="Napng" id="na1" class="naicoonclass" onclick="changeImage(this)">
	<img src="images/checked2.png" alt="Checkedpng" id="checked1" class="checkedicoonclass" onclick="changeImage(this)">
	<img src="images/error2.png" alt="Errorpng" id="error1" class="erroricoonclass" onclick="changeImage(this)">
</td>
<!-- ========== Kolom met comment en apparaat, foto 2figuren ========== -->
<td data-label="Comments" class="commentsmeldingen">
	<img src="images/comment2.png" alt="Commentpng" id="comment1" class="commenticoonclass" onclick="changeImage(this)">
	<img src="images/camera2.png" alt="Camerapng" id="camera1" class="cameraicoonclass" onclick="changeImage(this)">
</td>

Maar mijn javascript werkt hier dus niet op.. moet die niet kijken naar de unieke ID dan?
Code:
function changeImage (thisImage) {
  // wat is de src van de img waarop is geklikt
  var currentSrc = thisImage.src;
  var newSrc;
  // als de laatste 5 tekens gelijk zijn aan "2.png"
  if (currentSrc.substr(currentSrc.length - 5) == "2.png") {
    // dir/blah2.png  wordt  dir/blah.png
    newSrc = currentSrc.substr(0, currentSrc.length - 5) + ".png";
  } else {
    // dir/blah.png  wordt  dir/blah2.png
    newSrc = currentSrc.substr(0, currentSrc.length - 4) + "2.png";
  }
  thisImage.src = newSrc;
}
 
Vergelijk het met deze bijlage, die werkt in alle browsers ;)
 

Bijlagen

  • tabel-img-onclick.zip
    424,4 KB · Weergaven: 28
Het is exact hetzelfde als ik heb..
Heb mijn javascript gedeelte eens op de pagina zelf geplakt en nu werkt het wel, echt bizar
Maar thx bij deze
 
Druk in de browser op F12 en kies
- Elements om te zien hoe de Javascript jouw html aanpast
- Console om Javascript fouten te zien

Suc6 met programmeren. Have fun.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan