首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在javascript中使用多个div中的多个并行值创建数组?

如何在javascript中使用多个div中的多个并行值创建数组?
EN

Stack Overflow用户
提问于 2019-04-12 19:55:15
回答 1查看 491关注 0票数 1

我想将函数应用于多个包装器中的多个div对。Div应该从两个不同的类中按顺序并行选择。

我能想到的最好的方法就是用n个模块中的n对div组成一个数组,但是我不知道这个概念本身和语法是否正确。

现在,我想将函数应用于第一/第二/第三/...object-1和descript-1同时只在一个模块中进行div。对于下一个模块也是如此,相反,函数应该应用于object-2 -descript 2对。

更新代码:

现在我有三个不同的函数,一个用于下一个-上一个按钮,一个用于缩略图控制,最后一个用于显示对象/描述类div和突出显示拇指。我尝试过嵌套函数,但它不起作用。在创建3个独立的modules.forEach函数之前,我应该声明var并获取内容吗?

代码语言:javascript
复制
<script>
  // nodes Array
  let modules = Array.prototype.slice.call(document.querySelectorAll(".module"));
	
  // Loop over the modules without index.
  modules.forEach(function(module){
	
  var divIndex = 1;
  showDivs(divIndex);
	
  // Objects, descr, thumbs
  let objects = module.querySelectorAll(".object");
  let descripts = module.querySelectorAll(".descript");
  let thumbs = module.querySelectorAll(".thumb");

  // next-prev buttons
  function plusDivs(n) {
    showDivs(divIndex += n);
  }
	
  // thumb control
  function currentDiv(n) {
    showDivs(divIndex = n);
  }

  // div display
  function showDivs(n) {
    if (n > objects.length) {divIndex = 1}
    if (n < 1) {divIndex = objects.length}
    // hide content, shade thumb
    objects.style.display = "none";
    descripts.style.display = "none";
    thumbs.className = thumbs.className.replace(" active", "");
	
    // show only selected object-descr pair and highlight thumb
    for(var i = 0; i < objects.length; i++) {
      objects[divIndex-1].style.display = "block";
      descripts[divIndex-1].style.display = "block";
      thumbs[divIndex-1].className += " active";
    }
  }
});
</script>
代码语言:javascript
复制
<div class="module">
  <div class="content">LOREM IPSUM 1</div>
	
  <div class="wrapper">
  <div class="content">LOREM IPSUM 1</div>
		
    <div class="object">o1</div>
    <div class="object">o2</div>
    <div class="object">o3</div>

    <div class="descript">d1</div>
    <div class="descript">d2</div>
    <div class="descript">d3</div>
	
    <div class="thumb" onclick="currentDiv(1)">t1</div>
    <div class="thumb" onclick="currentDiv(2)">t2</div>
    <div class="thumb" onclick="currentDiv(3)">t3</div>
		
    <a class="prev" onclick="plusDivs(-1)">X</a>
    <a class="next" onclick="plusDivs(1)">X</a>
   </div>
</div>

<div class="module">
  <div class="content">LOREM IPSUM 2</div>
	
  <div class="wrapper">
  <div class="content">LOREM IPSUM 2</div>
		
    <div class="object">o4</div>
    <div class="object">o5</div>
    <div class="object">o6</div>

    <div class="descript">d4</div>
    <div class="descript">d5</div>
    <div class="descript">d6</div>
		
    <div class="thumb" onclick="currentDiv(1)">t4</div>
    <div class="thumb" onclick="currentDiv(2)">t5</div>
    <div class="thumb" onclick="currentDiv(3)">t6</div>
		
    <a class="prev" onclick="plusDivs(-1)">X</a>
    <a class="next" onclick="plusDivs(1)">X</a>
  </div>
</div>

EN

回答 1

Stack Overflow用户

发布于 2019-04-12 20:09:07

这就是你要找的东西吗?请参阅内联注释。还有,don't use .getElementsByClassName()

代码语言:javascript
复制
// Convert the node list into an Array for the best browser compatibility with Array.forEach()
let modules = Array.prototype.slice.call(document.querySelectorAll("div[class^='module-']"));

// Loop over the modules.
// The Array.forEach() method is much simpler than manual loops because you don't have
// to maintain the loop indexer.
modules.forEach(function(module){

  // Get the objects and descriptions (no arrays needed here because we're just
  // going to need to use indexes against the node lists.
  let objects = module.querySelectorAll("div[class='object']");
  let descriptions = module.querySelectorAll("div[class='descript']");
  
  // Clear out the objects and descriptions in the module.
  // Start by getting all the objects and descriptions into an array.
  let objectsDescriptions = Array.prototype.slice.call(
      module.querySelectorAll("[class='object'], [class='descript']"));
      
  // Then remove each item in the array from the document
  objectsDescriptions.forEach(function(element){ element.parentNode.removeChild(element); });
  
  // Loop the amount of times that matches the number of items in one of the arrays.
  // Here, a regular counting loop makes the most sense because it's all about looping
  // the correct number of times, not looping over DOM elements.
  for(var i = 0; i < objects.length; i++){
    // Repopulate the module with the current child elements, but in the new sequence
    module.insertBefore(objects[i], module.querySelector(".thumb"));
    module.insertBefore(descriptions[i], module.querySelector(".thumb"));
  }
  
  // Set up all the clickable elements to have click event handlers
  module.addEventListener("click", function(evt){
    // Check to see if it was a thumb or a prev/next that was clicked
    if(evt.target.classList.contains("thumb")){
      // Show the div that has the same index as the thumbnail that was clicked
      let thumbs = Array.prototype.slice.call(evt.target.parentNode.querySelectorAll(".thumb"));
      showDiv(evt.target.parentNode, thumbs.indexOf(evt.target));
    } else if(evt.target.classList.contains("prev") || evt.target.classList.contains("next")){
      // Show the div according to the data-offset attribute of the clicked element
      showDiv(evt.target.parentNode, +evt.target.dataset.offset, true);
    } 
  });
  
});

// ****************************************************************
// CODE TO SHOW DIVS
// ****************************************************************

let currentIndex = 0;

// div display
function showDiv(parent, index, nav) {
  // Hide all the objects and descriptions
  let items = parent.querySelectorAll(".object, .descript");
  Array.prototype.slice.call(items).forEach(function(el){
    el.classList.add("hidden");
  });
  
  if(nav){
    currentIndex += index; // Adjust for the offset
    if(currentIndex < 0){
      currentIndex = 0;
    } else if(currentIndex > (items.length / 2) - 1){
      currentIndex = (items.length / 2) - 1;
    }
    // Show just the ones that are supposed to be shown
    parent.querySelectorAll(".object")[currentIndex].classList.remove("hidden");
    parent.querySelectorAll(".descript")[currentIndex].classList.remove("hidden");
  } else {   
    // Show just the ones that are supposed to be shown
    parent.querySelectorAll(".object")[index].classList.remove("hidden");
    parent.querySelectorAll(".descript")[index].classList.remove("hidden");
  }

}
代码语言:javascript
复制
.hidden { display:none; }
.thumb, .prev, .next { cursor:pointer; color:blue; }
代码语言:javascript
复制
<div class="module-1">
    <div class="object">o1</div>
    <div class="object">o2</div>
    <div class="object">o3</div>

    <div class="descript">d1</div>
    <div class="descript">d2</div>
    <div class="descript">d3</div>
    
		<div class="thumb">t1</div>
		<div class="thumb">t2</div>
		<div class="thumb">t3</div>
		
		<span class="prev" data-offset="-1">&lt;</span>
		<span class="next" data-offset="1">&gt;</span>    
</div>

<div class="module-2">
    <div class="object">o4</div>
    <div class="object">o5</div>
    <div class="object">o6</div>

    <div class="descript">d4</div>
    <div class="descript">d5</div>
    <div class="descript">d6</div>
    
		<div class="thumb">t4</div>
		<div class="thumb">t5</div>
		<div class="thumb">t6</div>
		
		<span class="prev" data-offset="-1">&lt;</span>
		<span class="next" data-offset="1">&gt;</span>   
</div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55651083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档