JavaScript работает, когда используется setTimeout (), но он не работает, когда на странице WordPress используется document.EventListener(‘DOMContentLoaded’, x). Почему?

#javascript #wordpress #event-handling #settimeout #addeventlistener

#язык JavaScript #wordpress #обработка событий #время ожидания #addeventlistener

Вопрос:

У меня есть несколько строк кода JavaScript, которые собирают тексты заголовков из отдельных разделов и помещают их в соответствующие поля ввода. Они также выполняются на отдельных страницах с использованием wp_enqueue_script .

Он работает абсолютно нормально, когда setTimeout() используется:

 function passengerElevator() {  var getProductName = document.querySelectorAll('[data-id="6657316"]');  getProductName.forEach(function(item) {  var productName = item.querySelector('.lift');  var inputArea = item.querySelector('input[name=product]');  inputArea.value = productName.innerText;  });  var getProductName = document.querySelectorAll('[data-id="e9c06d5"]');  getProductName.forEach(function(item) {  var productName = item.querySelector('.lift');  var inputArea = item.querySelector('input[name=product]');  inputArea.value = productName.innerText;  }); setTimeout(function() { passengerElevator() },3000);  

Однако существует проблема с размером страницы (некоторые страницы имеют более 10 полей ввода), и я не хочу устанавливать астрономически высокое ms значение для задержки сценария. Поэтому я решил выстрелить из него DOMContentLoaded :

 document.addEventListener("DOMContentLoaded", passengerElevator); function passengerElevator() {  var getProductName = document.querySelectorAll('[data-id="6657316"]');  getProductName.forEach(function(item) {  var productName = item.querySelector('.lift'); // heading text (ex:Panoramic Lift)  var inputArea = item.querySelector('input[name=product]');  inputArea.value = productName.innerText; //ouput here  });  var getProductName = document.querySelectorAll('[data-id="e9c06d5"]');  getProductName.forEach(function(item) {  var productName = item.querySelector('.lift'); // Heading text (ex:Home Lift)  var inputArea = item.querySelector('input[name=product]');  inputArea.value = productName.innerText; // Output here  }); }  

Как вы, возможно, уже догадались, это не работает. Является ли мой код слишком грязным, чтобы его можно было выполнить быстрее, или есть какая-то другая проблема, которую я упускаю?

Я знаю, что подобные вопросы задавались ранее, однако ни один из существующих ответов, которые я нашел, не смог мне помочь.

Ответ №1:

Похоже, вы пытаетесь перебирать элементы, которые все еще не загружены. Возможно, они добавляются на страницу через Ajax, так DOMContentLoaded что тут ничего не поделаешь.

Вы можете создать свою собственную проверку для этих элементов с помощью setInterval , поэтому используйте что-то вроде этого:

 let dataIdCheck = setInterval(() =gt; {  if (document.querySelectorAll('[data-id="6657316"]').length gt; 0 amp;amp; document.querySelectorAll('[data-id="e9c06d5"]').length gt; 0) {  clearInterval(dataIdCheck);   // your code here  } }, 500);  

Этот код будет выполняться каждые 500 миллисекунд и проверять, существуют ли эти два элемента, используя .length . Как только они появятся, мы остановим интервал и запустим код.

Я также предлагаю сделать console.log('in') это, чтобы проверить, что наш интервал остановится, как только элементы будут найдены.

Комментарии:

1. похоже, вы правы насчет преждевременного цикла, хотя сценарий выполняется в footer . спасибо вам за ваш ответ. рад узнать, что stackoverflow предназначен не только для экспертов.

2. @junior_dev Даже если сценарий выполняется в нижнем колонтитуле, это не означает, что он будет выполняться после загрузки всех элементов, если они загружены через XHR, они всегда будут доступны после загрузки DOM. В вашем вопросе ничего не говорилось об элементах XHR, но из вашей проблемы я предположил, что это так. Если этот вопрос решил вашу проблему, подумайте о том, чтобы принять его в качестве ответа.

3. к сожалению, это не сработало. в любом случае, спасибо

4. @junior_dev Вы вставили блок console.log внутрь if ?, вы видели его в браузере DevTools?. Подумайте о том, чтобы обновить свой вопрос с помощью нового кода, который вы протестировали, это поможет сузить круг проблем.

5. это сработало. спасибо, чувак, я ценю это. Ранее в моем коде была опечатка. Последний вопрос? Есть ли у него какие-либо проблемы с производительностью?