why does it work properly when i use directly newImage.src in this loop?
Hi, iām new here pls assess my code
let displayedImage = document.querySelector('.displayed-img');
let thumbBar = document.querySelector('.thumb-bar');
let btn = document.querySelector('button');
let overlay = document.querySelector('.overlay');
for(let i = 1; i <= 5; i++) {
let newImage = document.createElement('img');
newImage.setAttribute('src', 'images/pic' + i +'.jpg');
thumbBar.appendChild(newImage);
newImage.onclick = function() {
let imageReplace = newImage.getAttribute('src');
displayedImage.setAttribute('src', imageReplace);
}
}
btn.onclick = function() Preformatted text{
let classCheck = btn.getAttribute('class');
if(classCheck === 'dark') {
btn.setAttribute('class', 'light');
btn.textContent = 'Lighten';
overlay.style.backgroundColor = 'rgba(0,0,0,0.5)';
} else {
btn.setAttribute('class', 'dark');
btn.textContent = 'Darken';
overlay.style.backgroundColor = 'rgba(0,0,0,0)';
}
}
Hi @740479865 ā your code is working because you have used an array to store the image names and then set the src values directly from those in each step. We donāt use an array but use a separate function.
Both techniques work pretty reasonably.
Hello there @papans.maxkeeble!
Iāve checked your code out, and it looks to be working perfectly. Great work!
Hi Guys,
Iām working through the JS course and have just finished the img gallery project.
I had been getting through the course and itās exercises rather quickly until I got to this one. Found it to be pretty challenging and frustrating at times but I managed to sort it out after 3 days working on it.
Here is my solution:
var displayedImage = document.querySelector(ā.displayed-imgā);
var thumbBar = document.querySelector(ā.thumb-barā);
var btn = document.querySelector(ābuttonā);
var overlay = document.querySelector(ā.overlayā);
/* Looping through images */
var imgArray = [āimages\pic1.jpgā, āimages\pic2.jpgā, āimages\pic3.jpgā, āimages\pic4.jpgā, āimages\pic5.jpgā];
for (var i = 0; i < imgArray.length; i++) {
var newImage = document.createElement(āimgā);
newImage.setAttribute(āsrcā, imgArray[i]);
thumbBar.appendChild(newImage);
function imgDisplay(e) {
var newSrc = e.target.getAttribute(āsrcā);
displayedImage.setAttribute(āsrcā, newSrc);
}
newImage.addEventListener(āclickā, imgDisplay);
}
/* Wiring up the Darken/Lighten button */
function btnAction() {
var btnClassName = btn.getAttribute(āclassā);
if (btnClassName === ādarkā) {
btn.setAttribute(āclassā, ālightā);
btn.textContent = ālightenā;
overlay.style.backgroundColor = ārgba(0,0,0,0.5)ā;
} else {
btn.setAttribute(āclassā, ādarkā);
btn.textContent = ādarkenā;
overlay.style.backgroundColor = ārgba(0,0,0,0)ā;
}
}
btn.addEventListener(āclickā, btnAction);
Hello, @Emmanuel_A_Valdez, and welcome to our community! I am so glad that you kept working on this exercise ā you have ended up with a really good set of code, which works well.
The only thing I noticed that you should change is as follows ā this line uses backslashes in the image paths:
var imgArray = [āimages\pic1.jpgā, āimages\pic2.jpgā, āimages\pic3.jpgā, āimages\pic4.jpgā, āimages\pic5.jpgā];
You should replace those with forward slashes, like so:
var imgArray = ['images/pic1.jpg', 'images/pic2.jpg', 'images/pic3.jpg', 'images/pic4.jpg', 'images/pic5.jpg'];
This is because web servers in general use forward slashes ā this code would break if you tried to run it through a server (and indeed, on my Mac). Iām guessing you are using a Windows machine for your coding? Windows tends to be more permissive when using backslashes.
Thanks for the assessment and tip. Noted.
Hi everyone! Hope youāre having fun. I have just finished my image gallery and hope it can be accessed. Do find my main.js file below:
var displayedImage = document.querySelector('.displayed-img');
var thumbBar = document.querySelector('.thumb-bar');
var btn = document.querySelector('button');
var overlay = document.querySelector('.overlay');
/* Looping through images */
for (let i = 1; i <= 5; i++) {
var newImage = document.createElement('img');
newImage.setAttribute('src', `images/pic${i}.jpg`);
thumbBar.appendChild(newImage);
newImage.onclick = function(e) {
newImage = e.target.getAttribute('src');
displayedImage.setAttribute('src', newImage);
}
}
/* Wiring up the Darken/Lighten button */
btn.onclick = function() {
if (btn.getAttribute('class') === 'dark') {
btn.setAttribute('class', 'light');
btn.textContent = 'Lighten';
overlay.style.backgroundColor = 'rgba(0,0,0,0.5)';
} else {
btn.setAttribute('class', 'dark');
btn.textContent = 'Darken';
overlay.style.backgroundColor = 'rgba(0,0,0,0)';
}
}
Many thanks.
Hi @samuel,
I just got back off holiday, so having less fun than I was last week
I looked through your code, and tested it, and it works perfectly. Nice usage of a template literal inside the for loop as well. Iād give this full marks; well done!
Hi, hope whoever reads this is doing well.
Hereās my code for the project. I did the project without looking at the suggestions, so itās a little different from the official code. I was hoping someone could assess my code:
const displayedImage = document.querySelector('.displayed-img');
const thumbBar = document.querySelector('.thumb-bar');
const btn = document.querySelector('button');
const overlay = document.querySelector('.overlay');
/* Looping through images */
for (let i = 1; i < 6; i++) {
const newImage = document.createElement('img');
newImage.setAttribute('src', 'images/pic' + i + '.jpg');
thumbBar.appendChild(newImage);
newImage.onclick = function () {
displayedImage.setAttribute('src', this.getAttribute('src'));
};
}
/* Wiring up the Darken/Lighten button */
btn.onclick = function () {
if (btn.innerHTML === 'Darken') {
overlay.style.backgroundColor = 'rgba(0,0,0,0.5)';
btn.innerHTML = 'Lighten';
} else {
overlay.style.backgroundColor = 'rgba(0,0,0,0)';
btn.innerHTML = 'Darken';
}
};
Thanks a lot. All the best!
@Isaac-Svi hi there, and thanks for sending in your code! I have tested this, and it works really well ā probably more efficient than our original version in fact
Well done on some great work!
Hi, thank you so much for your assessment! Very much appreciated. Have a great day.
Hereās mine
var displayedImage = document.querySelector('.displayed-img');
var thumbBar = document.querySelector('.thumb-bar');
var btn = document.querySelector('button');
var overlay = document.querySelector('.overlay');
/* Looping through images */
for(let i = 1; i <= 5; i++) {
var newImage = document.createElement('img');
newImage.setAttribute('src', 'images/pic' + i + '.jpg');
thumbBar.appendChild(newImage);
newImage.addEventListener('click', function(e) {
let src = e.target.getAttribute('src');
displayedImage.setAttribute('src', src);
});
}
/* Wiring up the Darken/Lighten button */
btn.addEventListener('click', function() {
if (btn.getAttribute('class') === 'dark') {
btn.setAttribute('class', 'light');
btn.textContent = 'Lighten';
overlay.style.backgroundColor = 'rgba(0,0,0,0.5)';
} else {
btn.setAttribute('class', 'dark');
btn.textContent = 'Darken';
overlay.style.backgroundColor = 'rgba(0,0,0,0)';
}
})
Hi there @abdi.faishal, and welcome to our community! Thank you for sending in your code. Iāve tested it, and it works perfectly; well done on some great work!
Hi,
Iām confused about the first point under Adding an onclick handler to each thumbnail image. It says
Using
newImage
wonāt work, as the loop is completed before the event handlers are applied; doing it this way would result in thesrc
value of the last<img>
being returned in every case.
However, for me it works just fine. I used
newImage.onclick = function() {
displayedImage.src = newImage.src;
}
The solution instead uses
newImage.onclick = function(event) {
displayedImage.src = event.target.src;
}
(The solution also uses getAttribute and setAttribute instead of the dot notation, but this doesnāt matter for the above.)
I am confused to what is the difference between using myImage and event.target, when my code works just fine?
@gerfolder thanks for sharing your solution here. The way that I was doing it was just needlessly overcomplicated. Iāve updated the assessment description and files to your solution instead
Image gallery
Hi everyone!Please review my JS code)
var displayedImage = document.querySelector(".displayed-img");
var thumbBar = document.querySelector(".thumb-bar");
btn = document.querySelector("button");
var overlay = document.querySelector(".overlay");
/* Looping through images */
for (var i = 1; i <= 5; i ++) {
var newImage = document.createElement("img");
newImage.setAttribute("src", "images/pic" + i + ".jpg");
thumbBar.appendChild(newImage);
newImage.onclick = function (e) {
var imgAttr = e.target.getAttribute("src");
displayedImage.setAttribute("src", imgAttr);
}
}
/* Wiring up the Darken/Lighten button */
btn.onclick = function () {
var btnAttr = btn.getAttribute("class");
if (btnAttr === "dark") {
btn.setAttribute("class", "light");
btn.textContent = "Lighten";
overlay.style.backgroundColor = "rgba(0,0,0,0.5)";
} else {
btn.setAttribute("class", "dark");
btn.textContent = "Darken";
overlay.style.backgroundColor = "rgba(0,0,0,0)";
}
}