getBoundingClientRect() возвращает ноль

#javascript #html

#язык JavaScript #HTML

Вопрос:

Что делает приведенный ниже код, так это создает промежуток с определенными размерами и положением (предлагаемый getBoundingClientRect), когда мышь наведена на lt;agt; тег, и это отлично работает

  lt;!DOCTYPE htmlgt; lt;html lang="en"gt; lt;headgt;  lt;meta charset="UTF-8"gt;  lt;titlegt;ollow Along Navlt;/titlegt;  lt;link rel="stylesheet" href="style.css"gt; lt;/headgt; lt;bodygt;   lt;navgt;  lt;ul class="menu"gt;  lt;ligt;lt;a href=""gt;Homelt;/agt;lt;/ligt;    lt;/ulgt;  lt;/navgt;   lt;div class="wrapper"gt;  lt;pgt;Lorem ipsum dolor sit amet, lt;a href=""gt;consecteturlt;/agt; adipisicing elit. Est lt;a href=""gt;explicabolt;/agt; unde natus necessitatibus esse obcaecati distinctio, aut itaque, qui vitae!lt;/pgt;  lt;pgt;Aspernatur sapiente quae sint lt;a href=""gt;solutalt;/agt; modi, atque praesentium laborum pariatur earum lt;a href=""gt;quaeratlt;/agt; cupiditate consequuntur facilis ullam dignissimos, aperiam quam veniam.lt;/pgt;  lt;/divgt;  lt;scriptgt;  const triggers = document.querySelectorAll('a');  const highlight = document.createElement('span');  highlight.classList.add('highlight');  document.body.appendChild(highlight);   function highlightLink(a) {  const linkCoords = a.getBoundingClientRect();  const coords = {  width: linkCoords.width,  height: linkCoords.height,  top: linkCoords.top   window.scrollY,  left: linkCoords.left   window.scrollX  };   highlight.style.width = `${coords.width}px`;  highlight.style.height = `${coords.height}px`;  highlight.style.transform = `translate(${coords.left}px, ${coords.top}px)`;   }   triggers.forEach(a =gt; highlightLink(a));  lt;/scriptgt; lt;/bodygt; lt;/htmlgt;   

Я хотел создать модульное тестирование для приведенного выше кода в теге script, поэтому я придумал этот сценарий на основе NodeJS

 const index = require('./index.js'); //runs the html in express app   var jsdom = require('jsdom'); const { JSDOM } = jsdom; const { document } = (new JSDOM('')).window; global.document = document;  const test =async()=gt;{   const request = require('supertest');  const response = await request(index).get("/");    document.body.innerHTML = response.text;  const triggers = document.querySelectorAll('a')  var highlight = document.createElement('span'); highlight.classList.add('highlight'); document.body.appendChild(highlight);     function checkThis(a) {    const linkCoords = a.getBoundingClientRect();  console.log(linkCoords.width)   }  triggers.forEach(a =gt; checkThis(a)); }     test()  

По какой-то причине я получаю нулевую ширину для всех lt;agt; тегов. Даже другие свойства от getBoundingClientRect равны нулю. Каковы могут быть возможные причины этого?. И каков будет лучший способ протестировать этот код с помощью Jest и Супертеста?

Ответ №1:

Убедитесь, что ДОМ готов. Перед привязкой событий или доступом к элементам. Кроме того, вы всегда будете получать нули, если у элемента, к которому вы пытаетесь получить доступ, есть display:none .

Чтобы проверить, не проблема ли в том, что DOM загружается слишком поздно, просто зарегистрируйте переменную triggers и посмотрите, имеет ли она правильные значения, если нет, вы можете сделать это:

 document.addEventListener('DOMContentLoaded', (event) =gt; {  // put code that needs to wait for DOM to load here })