无法选择div元素的类并向该元素添加另一个类[JS]

问题描述 投票:0回答:1

我正在做这个 GPS 项目,遇到了一个问题。我想构建一个由 360x180 网格项组成的网格,每个网格项代表一个 GPS 坐标,它动态地获取一个自己的非常特定的类,以便我稍后可以识别该坐标并使用它。不幸的是,浏览器返回给我这个错误消息:TypeError:无法读取 null 的属性(读取“classList”)。

我尝试选择坐标的确切单个类,然后使用 classList.add() 方法添加一个新类('active'),我想在 CSS 中操作它,以便该坐标将获得红色背景&它将在网格上可见。效果不太好,我也在玩选择器,但没有任何效果。唯一奇怪的是在 css 中手动设置颜色,如下所示:

.column-350-row-100 {
  background-color: rgb(207, 18, 11);
}

但这显然不是很有帮助。

html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>GPS-coordinate Tool</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <div class="grid-container"></div>
    <script src="script.js"></script>
  </body>
</html>

javascript:

'use strict';

//creates grid (for visual understanding) for every single GPS-coordinate. Then add's for each div a specified class.
document.addEventListener('DOMContentLoaded', function () {
  const container = document.querySelector('.grid-container');
  for (let lo = 1; lo <= 180; lo++) {
    for (let la = 1; la <= 360; la++) {
      const div = document.createElement('div');
      div.className = 'grid-item';
      container.appendChild(div);
      div.classList.add(`la-${la}-lo-${lo}`);
    }
  }
});

// "Generates" and returns random GPS coordinates in an object 
const randomGpsCoordinates = function () {
  const gpsCoordinate = {
    latitude: Math.trunc(Math.random() * 360) + 1,
    longitude: Math.trunc(Math.random() * 180) + 1,
  };
  return gpsCoordinate;
};

//empty array to save all Objects which consist of one GPS coordinate pair each (longitude, latitude)
const gpsCoordinates = [];

//Generates and fills the array with each GPS coordinate
for (let i = 0; i < 5; i++) {
  gpsCoordinates.push(randomGpsCoordinates());
}

//Problem to solve: this doesn't work, in the Browser it shows me that the '.la-5-lo-100' should exists, but if I try to select it it ends in an error
// => TypeError: Cannot read properties of null (reading 'classList')
document.querySelector('.la-5-lo-100').classList.add('active');

CSS:

.grid-container {
  display: grid;
  grid-template-columns: repeat(360, 1fr); /* Creates 18 columns */
  grid-template-rows: repeat(180, 5px); /* Creates 36 rows of 50px each */
}

.grid-item {
  background-color: #f0f0f0;
  border: 1px solid #ccc;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px; /* Optional for text inside grid items */
}

.active {
  background-color: rgb(207, 18, 11);
}

.column-350-row-100 {
  background-color: rgb(207, 18, 11);
}
javascript html css dom
1个回答
0
投票

这会引发错误,因为您使用 Javascript 添加元素,而此时它正在查找的 DOM 元素不存在, 这就是你所拥有的,但它不起作用:

document.querySelector('.la-5-lo-100').classList.add('active');

请检查该元素是否确实存在:

const element = document.querySelector('.la-5-lo-100');
    if (element) {
      element?.classList?.add('active')
    }

如果这不起作用,请将类列表添加行移到 Javascript 文件顶部的第二个 for 循环下方。

如果这不起作用,在第一个 foo 循环之后添加一个 let 变量,以便它向您发出信号,表明项目已完全加载,然后尝试添加 className, 事情是这样的:

let hasFinishedRendering = false;
document.addEventListener('DOMContentLoaded', function () {
      const container = document.querySelector('.grid-container');
      for (let lo = 1; lo <= 180; lo++) {
        for (let la = 1; la <= 360; la++) {
          const div = document.createElement('div');
          div.className = 'grid-item';
          container.appendChild(div);
          div.classList.add(`la-${la}-lo-${lo}`);
        }
      }
     hasFinishedRendering = true
    });

const element = document.querySelector('.la-5-lo-100');
if (element && hasFinishedRendering) {
  element?.classList?.add('active')
}
© www.soinside.com 2019 - 2024. All rights reserved.