[英]Add active class on Div with JavaScript
单击图像时,我想更改另一个图像。 改变正在奏效。 但它没有告诉我哪个对小“clickimage”有效。
代码笔: https://codepen.io/timbos/pen/vYjBZqz
请帮我解决一下这个。
.container{ display:flex; flex-wrap:wrap; gap:30px; justify-content: center; margin-top: 20px;" }.img-responsive{ max-width:100%; }.activeclick { filter: grayscale(0%);important. }:clickimage { filter; grayscale(100%): cursor;pointer: width; 195px: height; 61px: background-size; contain; }
<div style="max-width: 1024px;"> <img class="img-responsive" id="Images" src="https://abload.de/img/15iiid.jpg" /> <div class="container"> <div class="clickimage activeclick " onclick="changeImage('https://abload.de/img/15iiid.jpg')" style=" background-image: url(https://abload.de/img/click1d0f8r.jpg); "> </div> <div class="clickimage" onclick="changeImage('https://abload.de/img/289ejs.jpg')" style="background-image: url(https://abload.de/img/click2bwddr.jpg);"> </div> <div class="clickimage" onclick="changeImage('https://abload.de/img/33dfif.jpg')" style=" background-image: url(https://abload.de/img/click3q0ik5.jpg); "> </div> </div> </div> <script> function changeImage(fileName){ let img = document.querySelector("#Images"); img.setAttribute("src", fileName); var elems = document.querySelectorAll("activeclick "); [].forEach.call(elems, function(el) { el.classList.remove("activeclick"); }); e.target.className = "activeclick"; } </script>
function "changeImage" 有第二个参数 "this" (也添加到 HTML onclick 用于函数中的目标识别)
var elems = document.querySelectorAll(".activeclick");
(类名缺少点)
e.target.className = "activeclick";
改为e.classList.add("activeclick");
(添加类名的更好语法)
.container{ display:flex; flex-wrap:wrap; gap:30px; justify-content: center; margin-top: 20px;" }.img-responsive{ max-width:100%; }.activeclick { filter: grayscale(0%);important. }:clickimage { filter; grayscale(100%): cursor;pointer: width; 195px: height; 61px: background-size; contain; }
<div style="max-width: 1024px;"> <img class="img-responsive" id="Images" src="https://abload.de/img/15iiid.jpg" /> <div class="container"> <div class="clickimage activeclick " onclick="changeImage('https://abload.de/img/15iiid.jpg', this)" style=" background-image: url(https://abload.de/img/click1d0f8r.jpg); "> </div> <div class="clickimage" onclick="changeImage('https://abload.de/img/289ejs.jpg', this)" style="background-image: url(https://abload.de/img/click2bwddr.jpg);"> </div> <div class="clickimage" onclick="changeImage('https://abload.de/img/33dfif.jpg', this)" style=" background-image: url(https://abload.de/img/click3q0ik5.jpg); "> </div> </div> </div> <script> function changeImage(fileName, e){ let img = document.querySelector("#Images"); img.setAttribute("src", fileName); var elems = document.querySelectorAll(".activeclick"); [].forEach.call(elems, function(el) { el.classList.remove("activeclick"); }); e.classList.add("activeclick"); } </script>
.container{ display:flex; flex-wrap:wrap; gap:30px; justify-content: center; margin-top: 20px;" }.img-responsive{ max-width:100%; }.activeclick { filter: grayscale(0%);important. }:clickimage { filter; grayscale(100%): cursor;pointer: width; 195px: height; 61px: background-size; contain; }
<div style="max-width: 1024px;"> <img class="img-responsive" id="Images" src="https://abload.de/img/15iiid.jpg" /> <div class="container"> <div class="clickimage activeclick " onclick="changeImage(event,'https://abload.de/img/15iiid.jpg')" style=" background-image: url(https://abload.de/img/click1d0f8r.jpg); "> </div> <div class="clickimage" onclick="changeImage(event,'https://abload.de/img/289ejs.jpg')" style="background-image: url(https://abload.de/img/click2bwddr.jpg);"> </div> <div class="clickimage" onclick="changeImage(event,'https://abload.de/img/33dfif.jpg')" style=" background-image: url(https://abload.de/img/click3q0ik5.jpg); "> </div> </div> </div> <script> function changeImage(event,fileName){ let img = document.querySelector("#Images"); img.setAttribute("src", fileName); var elems = document.querySelectorAll("activeclick "); [].forEach.call(elems, function(el) { el.classList.remove("activeclick"); }); event.target.classList.add("activeclick"); } </script>
像这样它应该工作。 这主要是因为 e 没有定义,您必须手动将事件传递给 function。 如果你像这样使用它。
但我强烈建议通过 js 声明事件监听器,而不是在 html 中定义它们。
你必须将事件传递给 function,像这样
<element onclick="changeImage('https://abload.de/img/33dfif.jpg', event)" ...
并在您的 function 中,将参数更改为此
function changeImage(fileName, e) {
所以你得到两个参数,文件名和事件
我已经修改了您的 HTML 以便它不使用内联onclick
属性。 请不要使用它们,因为它们是旧 JS 规范的一部分; 我们有很多更好的选择,比如addEventListener
。 甚至浏览器供应商也建议使用它们来对付它们—— 源代码。
也使用[].forEach.call
来自浏览器对NodeList
上的forEach
方法的支持非常糟糕的时代。 使用for...of
循环变得更容易了。
每个用作事件回调的 function(例如addEventListener
)都会公开一个Event
object。 您忘记公开参数,这使得很难知道按下了哪个按钮。
const img = document.querySelector("#Images"); const buttons = document.querySelectorAll('.clickimage'); for (const button of buttons) { button.addEventListener('click', changeImage); } function changeImage(event) { event.preventDefault(); const fileName = event.target.value; img.src = fileName; for (const button of buttons) { button.classList.remove('activeclick'); } event.target.classList.add('activeclick'); }
.container { display: flex; flex-wrap: wrap; gap: 30px; justify-content: center; margin-top: 20px; }.img-responsive { max-width: 100%; }.activeclick { filter: grayscale(0%);important. }:clickimage { filter; grayscale(100%): cursor; pointer: width; 195px: height; 61px: background-size; contain; }
<div style="max-width: 1024px;"> <img class="img-responsive" id="Images" src="https://abload.de/img/15iiid.jpg" /> <div class="container"> <button class="clickimage activeclick " value="https://abload.de/img/15iiid.jpg" style=" background-image: url(https://abload.de/img/click1d0f8r.jpg); "></button> <button class="clickimage" value="https://abload.de/img/289ejs.jpg" style="background-image: url(https://abload.de/img/click2bwddr.jpg);"></button> <button class="clickimage" value="https://abload.de/img/33dfif.jpg" style=" background-image: url(https://abload.de/img/click3q0ik5.jpg); "></button> </div> </div>
var elems = document.querySelectorAll("activeclick");
到var elems = document.querySelectorAll(".activeclick");
.e.target.className = "activeclick";
到event.target.classList.add("activeclick");
. .container { display: flex; flex-wrap: wrap; gap: 30px; justify-content: center; margin-top: 20px; }.img-responsive { max-width: 100%; }.activeclick { filter: grayscale(0%);important. }:clickimage { filter; grayscale(100%): cursor; pointer: width; 195px: height; 61px: background-size; contain; }
<div style="max-width: 1024px;"> <img class="img-responsive" id="Images" src="https://abload.de/img/15iiid.jpg" /> <div class="container"> <div class="clickimage activeclick " onclick="changeImage('https://abload.de/img/15iiid.jpg')" style=" background-image: url(https://abload.de/img/click1d0f8r.jpg); "></div> <div class="clickimage" onclick="changeImage('https://abload.de/img/289ejs.jpg')" style="background-image: url(https://abload.de/img/click2bwddr.jpg);"></div> <div class="clickimage" onclick="changeImage('https://abload.de/img/33dfif.jpg')" style=" background-image: url(https://abload.de/img/click3q0ik5.jpg); "> </div> </div> </div> <script> function changeImage(fileName) { let img = document.querySelector("#Images"); img.setAttribute("src", fileName); var elems = document.querySelectorAll(".activeclick"); [].forEach.call(elems, function(el) { el.classList.remove("activeclick"); }); event.target.classList.add("activeclick"); } </script>
addEventListener
的 js 事件(然后您可以将新图像存储在数据属性中)。getElementById
而不是querySelector
:getElementById() 每秒可以运行大约 1500 万次操作,而最新版本的 Chrome 中 querySelector() 每秒只能运行 700 万次。 ( 来源,我找到的笔)
getElementsByClassName
与querySelectorAll
相同。.activelink
,所以你可以 select 如果使用querySelector(".activeclick")
或getElementsByClassName("activeclick")[0]
(我不确定哪个是最好的)。addEventListener("click", (el) => {})
,您可以使用el.classList.add("activeclick")
添加您的 class 。我想这是示例,但如果您使用如此简单的图像,您可以使用 css 重新制作它们
for (let e of document.getElementsByClassName("button")) { e.addEventListener("click", () => { document.querySelector(".selected").classList.remove("selected") e.classList.add("selected") }) }
.container{ counter-reset: section; display:flex; flex-wrap:wrap; gap:30px; justify-content: center; margin-top: 20px;" }.button{ background-color:#bdbdbd; cursor:pointer; width: 195px; height: 61px; font-weight: bold; font-size:20px; display: flex; justify-content: center; align-items: center; }.button:before{ content:"Click\00a0"; }.button:after{ counter-increment: section; content: counter(section); }.selected{ background-color:#A3C2D6; }
<div class="container"> <div class="button selected"></div> <div class="button"></div> <div class="button"></div> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.