简体   繁体   English

简化 Javascript - 这是阵列的情况吗?

[英]Simplify Javascript - is this a case for an array?

I'm quite new to the whole JS thing.我对整个 JS 很陌生。 I'm currently developing my own design portfolio to get some deeper insights into HTML, CSS and JS.我目前正在开发自己的设计组合,以更深入地了解 HTML、CSS 和 JS。

With the following lines I fill my flickity slider, regarding which tile of my gallery is selected.用以下几行填充我的轻弹 slider,关于选择我的画廊的哪个图块。 I'm sure that there will be a much shorter way to code this, but I'm not sure how.我敢肯定会有更短的方法来编码,但我不确定如何。 I only know that it should be vanilla JS:-)我只知道应该是vanilla JS:-)

 // Slider 01
var trigger1 = document.getElementById("trigger1");
trigger1.onclick = function () {
  cell1.src = "./_mat/slider_01_01.png";
  cell2.src = "./_mat/slider_01_02.png";
  cell3.src = "./_mat/slider_01_03.png";
  cell4.src = "./_mat/slider_01_04.png";
  showSlider();
};

// Slider 02
var trigger2 = document.getElementById("trigger2");
trigger2.onclick = function () {
  cell1.src = "./_mat/slider_02_01.png";
  cell2.src = "./_mat/slider_02_02.png";
  cell3.src = "./_mat/slider_02_03.png";
  cell4.src = "./_mat/slider_02_04.png";
  showSlider();
};

// Slider 03
var trigger3 = document.getElementById("trigger3");
trigger3.onclick = function () {
  cell1.src = "./_mat/slider_03_01.png";
  cell2.src = "./_mat/slider_03_02.png";
  cell3.src = "./_mat/slider_03_03.png";
  cell4.src = "./_mat/slider_03_04.png";
  showSlider();
};

// Slider 04
var trigger4 = document.getElementById("trigger4");
trigger4.onclick = function () {
  cell1.src = "./_mat/slider_04_01.png";
  cell2.src = "./_mat/slider_04_02.png";
  cell3.src = "./_mat/slider_04_03.png";
  cell4.src = "./_mat/slider_04_04.png";
  showSlider();
};

// Slider 05
var trigger5 = document.getElementById("trigger5");
trigger5.onclick = function () {
  cell1.src = "./_mat/slider_05_01.png";
  cell2.src = "./_mat/slider_05_02.png";
  cell3.src = "./_mat/slider_05_03.png";
  cell4.src = "./_mat/slider_05_04.png";
  showSlider();
};

// Slider 06
var trigger6 = document.getElementById("trigger6");
trigger6.onclick = function () {
  cell1.src = "./_mat/slider_06_01.png";
  cell2.src = "./_mat/slider_06_02.png";
  cell3.src = "./_mat/slider_06_03.png";
  cell4.src = "./_mat/slider_06_04.png";
  showSlider();
};

Thanks a lot for your help.非常感谢你的帮助。 I really appreciate it!对此,我真的非常感激!

Try this:尝试这个:

for (let i = 1; i <= 6; i++) {
  var trigger = document.getElementById("trigger" + i);
  trigger.onclick = function () {
    cell1.src = "./_mat/slider_0"+i+"_01.png";
    cell2.src = "./_mat/slider_0"+i+"_02.png";
    cell3.src = "./_mat/slider_0"+i+"_03.png";
    cell4.src = "./_mat/slider_0"+i+"_04.png";
    showSlider();
  };
}

Take a look at this:看看这个:

 var triggers = document.getElementsByClass("trigger"); var cells = [cell1,cell2,cell3,cell4] [].forEach.call(triggers, function (trigger) { let id = trigger.id.replace('trigger','') trigger.addEventListener("click", function() { cells.forEach(function(cell,i) { cell.scr = "./_mat/slider_"+id.padStart(2, '0')+"_"+ (''+i).padStart(2,'0') +".png"; }) showSlider(); }) });

It's better to add an event listener so that you can listen to several events.最好添加一个事件侦听器,以便您可以侦听多个事件。 Also, you have to make your code be able to handle a various number of elements: in my code you can put all the triggers you want.此外,您必须使您的代码能够处理各种数量的元素:在我的代码中,您可以放置您想要的所有触发器。 I'm sure there is way inyour code to get the "cells", because initiating the array hardcoded like this is abad practice.我确定您的代码中有办法获取“单元格”,因为像这样启动硬编码的数组是不好的做法。

Try this尝试这个

It does not care how many triggers you have - at least up to 99它不关心你有多少触发器 - 至少最多 99

const pad = num => ("0"+num).slice(-2); // change number of 0s and slice if more than 99 triggers

[...document.querySelectorAll("[id^=trigger]")].forEach(function(trigger) {
  trigger.addEventListener("click",function() { 
    const idx = this.id.replace("trigger","");
    cell1.src = "./_mat/slider_"+pad(idx)+"_01.png";
    cell2.src = "./_mat/slider_"+pad(idx)+"_02.png";
    cell3.src = "./_mat/slider_"+pad(idx)+"_03.png";
    cell4.src = "./_mat/slider_"+pad(idx)+"_04.png";
    showSlider();
  });
});  

You can do the following steps:您可以执行以下步骤:

  1. Create the array where keys are trigger counter and values are array of images;创建数组,其中键是触发计数器,值是图像数组;
  2. Create the function for onclick, where you pass parameter "key", the key is key of the array.为onclick创建function,其中传入参数“key”,key为数组的key。

I think this is more flexible as you can add images with any names.我认为这更灵活,因为您可以添加任何名称的图像。

Note that there are several patterns in your script.请注意,您的脚本中有几种模式。 Both in the src strings, in the name of the selectors (trigger1, trigger2, ...) and name of variables, (cell1, cell2, ...).在 src 字符串中,在选择器的名称(trigger1,trigger2,...)和变量的名称中,(cell1,cell2,...)。 You could simplify all of this in a loop and using an array, see an example:您可以在循环中简化所有这些并使用数组,请参见示例:

 for(let i = 1; i <= 6; i++) { let trigger = document.querySelector('#trigger' + i) trigger.addEventListener('click', event => { for(let b = 1; b <= 4; b++) { cell[b].src = "./_mat/slider_01_0" + b + ".png" showSlider() } } }

  • Important , transform ceill into an array with each of the elements instead of creating several ceill variables, that way you could use this code above重要的是,将 ceill 转换为包含每个元素的数组,而不是创建多个 ceill 变量,这样您就可以使用上面的代码

I would do something like:我会做类似的事情:

const cells = [cell1, cell2, cell3, cell4];
document.querySelectorAll("[id^=trigger]")].forEach(node => {
  const index = node.id.substr(7);

  node.addEventListener("click", () => {
    cells.forEach((cell, i) => 
      cell.src = `./_mat/slider_${index.padStart(2, "0")}_${String(i + 1).padStart(2, "0"}.png`);

    showSlider();
  });
});

Assuming you're running JS in a modern environment that supports template literals , padStart and NodeList's forEach假设您在支持模板文字padStartNodeList 的 forEach的现代环境中运行 JS

If you're sure you will never have more than 9 images you can definitely remove the padStart part.如果你确定你永远不会有超过 9 个图像,你绝对可以删除padStart部分。

PS This is assuming you're not modifying the underline HTML. PS 这是假设您没有修改下划线 HTML。 If you can do that, it's better practice use classes instead of IDs.如果你能做到这一点,最好的做法是使用类而不是 ID。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM