javascript - 当我尝试对控制号进行编码时,为什么会收到无法读取属性消息?

标签 javascript jquery html css

我是编码和编程新手,我一直在 YouTube 上关注一个程序员使用 HTML、CSS 和 Javascript 制作响应式缩略图 slider 的屏幕录制。
我已经尝试获取要在页面上显示的幻灯片的控制编号,但我仍然收到此错误消息:

script.js:48 Uncaught TypeError: Cannot read property 'appendChild' of null at start (script.js:48) at load (script.js:23)at script.js:51 start @ script.js:48 load @ script.js:23 (anonymous) @ script.js:51"

有人可以告诉我为什么会发生这种情况吗?我的代码如下。

const controls = document.querySelector(".controls");
const container = document.querySelector(".thumbnailcontainer");
const allBox = container.children;
const containerWidth = container.offsetWidth;
const margin = 30;
var item = 0;
var totalItems = 0;

// item setup per slide

responsive = 
  [ { breakPoint: { width:    0, item: 1 }} // if width greater than    0 (1 will item show)
  , { breakPoint: { width:  600, item: 2 }} // if width greater than  600 (2 will item show)
  , { breakPoint: { width: 1000, item: 6 }} // if width greater than 1000 (4 will item show)
  ] 

function load() {
  for (let i = 0; i < responsive.length; i++) {
    if (window.innerWidth > responsive[i].breakPoint.width) {
      items = responsive[i].breakPoint.item
    }
  }
  start();
}

function start() {
  var totalItemsWidth = 0
  for (let i = 0; i < allBox.length; i++) {
    //width and margin setup of items
    allBox[i].style.width = (containerWidth / items) - margin + "px";
    allBox[i].style.margin = (margin / 2) + "px";
    totalItemsWidth += containerWidth / items;
    totalItems++;
  }
  //tumbnail-container width set up
  container.style.width = totalItemsWidth + "px";

  //slides controls number set up
  const allSlides = Math.ceil(totalItems / items);
  const ul = document.createElement("ul");
  for (let i = 1; i <= allSlides; i++) {
    const li = document.createElement("li");
    li.id = i;
    li.innerHTML = i;
    li.setAttribute("onclick", "controlSlides(this)");
    ul.appendChild(li);
  }
  controls.appendChild(ul);
}

window.onload = load();
* {
  box-sizing: border-box;
}
.thumbnailslider {
  width: 100%;
  float: left;
  overflow: hidden;
}
.thumbanilslider .thumbnailcontainer {
  width: 100%;
  float: left;
}
.thumbnailslider .artitem {
  height: 175px;
  background-color: grey;
  line-height: 175px;
  text-align: center;
  font-size: 50px;
  color: #ffffff;
  float: left;
}
<div class="thumbnailslider">
  <div class="thumbnailcontainer">
    <div class="artitem">  1 </div>
    <div class="artitem">  2 </div>
    <div class="artitem">  3 </div>
    <div class="artitem">  4 </div>
    <div class="artitem">  5 </div>
    <div class="artitem">  6 </div>
    <div class="artitem">  7 </div>
    <div class="artitem">  8 </div>
    <div class="artitem">  9 </div>
    <div class="artitem"> 10 </div>
  </div>

  <!-- Control Slides -->
  <div class="artcontrols">

  </div>
</div>

最佳答案

你的类名错误

const controls = document.querySelector(".controls");
   
const container = document.querySelector(".thumbnailcontainer");
const allBox = container.children;
const containerWidth = container.offsetWidth;
const margin = 30;
var item = 0;
var totalItems = 0;

// item setup per slide

responsive = 
  [ { breakPoint: { width:    0, item: 1 }} // if width greater than    0 (1 will item show)
  , { breakPoint: { width:  600, item: 2 }} // if width greater than  600 (2 will item show)
  , { breakPoint: { width: 1000, item: 6 }} // if width greater than 1000 (4 will item show)
  ] 

function load() {
  for (let i = 0; i < responsive.length; i++) {
    if (window.innerWidth > responsive[i].breakPoint.width) {
      items = responsive[i].breakPoint.item
    }
  }
  start();
}

function start() {
  var totalItemsWidth = 0
  for (let i = 0; i < allBox.length; i++) {
    //width and margin setup of items
    allBox[i].style.width = (containerWidth / items) - margin + "px";
    allBox[i].style.margin = (margin / 2) + "px";
    totalItemsWidth += containerWidth / items;
    totalItems++;
  }
  //tumbnail-container width set up
  container.style.width = totalItemsWidth + "px";

  //slides controls number set up
  const allSlides = Math.ceil(totalItems / items);
  const ul = document.createElement("ul");
  for (let i = 1; i <= allSlides; i++) {
    const li = document.createElement("li");
    li.id = i;
    li.innerHTML = i;
    li.setAttribute("onclick", "controlSlides(this)");
    ul.appendChild(li);
  }
 controls.appendChild(ul);
}

window.onload = load();
* {
  box-sizing: border-box;
}
.thumbnailslider {
  width: 100%;
  float: left;
  overflow: hidden;
}
.thumbanilslider .thumbnailcontainer {
  width: 100%;
  float: left;
}
.thumbnailslider .artitem {
  height: 175px;
  background-color: grey;
  line-height: 175px;
  text-align: center;
  font-size: 50px;
  color: #ffffff;
  float: left;
}
<div class="thumbnailslider">
  <div class="thumbnailcontainer">
    <div class="artitem">  1 </div>
    <div class="artitem">  2 </div>
    <div class="artitem">  3 </div>
    <div class="artitem">  4 </div>
    <div class="artitem">  5 </div>
    <div class="artitem">  6 </div>
    <div class="artitem">  7 </div>
    <div class="artitem">  8 </div>
    <div class="artitem">  9 </div>
    <div class="artitem"> 10 </div>
  </div>

  <!-- Control Slides -->
  <div class="controls">

  </div>
</div>

关于javascript - 当我尝试对控制号进行编码时,为什么会收到无法读取属性消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60766060/

相关文章:

javascript - 使用数学符号作为动态变量?

javascript - 有人建议我使用 Jquery 来验证我的表单,但它不起作用,我该如何修复?

javascript - 如何调用js文件中的函数?

css - 彻底消除<div>溢出

javascript - 如何迭代 json 对象列表?

javascript - 将数据传递到渲染 Backbone.js

javascript - 使用 chrome 扩展检查 javascript 库是否存在

javascript - Twitter Bootstrap 选项卡未激活

php - tbody 不允许点击

jquery - 如果包含类为 ="dropdown-menu"的 UL,则将类添加到父 LI