Подождите, пока элемент существует

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

что я хочу сделать

var select = document.getElementsByClassName("pp_pricing_options")[0];
var plan = localStorage.getItem("Plan");
plan = plan.replaceAll(/\s+/g, '');
plan = plan.toLowerCase();
plan = plan.charAt(0).toLocaleUpperCase() + plan.substring(1);
for(var i = 0; i < select.length; i++)
{
    if (select[i].text.includes(plan)){
        select[i].selected = true;
    }
}

что я пробовал

document.addEventListener("DOMContentLoaded", () => {
    var select = document.getElementsByClassName("pp_pricing_options")[0];
    var plan = localStorage.getItem("Plan");
    plan = plan.replaceAll(/\s+/g, '');
    plan = plan.toLowerCase();
    plan = plan.charAt(0).toLocaleUpperCase() + plan.substring(1);
    for(var i = 0; i < select.length; i++)
    {
      if (select[i].text.includes(plan)){
         select[i].selected = true;
      }
    }
});
window.onload = function(){
     var select = document.getElementsByClassName("pp_pricing_options")[0];
     var plan = localStorage.getItem("Plan");
     plan = plan.replaceAll(/\s+/g, '');
     plan = plan.toLowerCase();
     plan = plan.charAt(0).toLocaleUpperCase() + plan.substring(1);
     for(var i = 0; i < select.length; i++)
     {
      if (select[i].text.includes(plan)){
          select[i].selected = true;
      }
     }
}

я также попробовал функцию готовности документа, используя jquery

я также попробовал решения по этой ссылке, но мое ожидание продолжает ждать без ответа Как дождаться, пока элемент появится?

код, который я набрал

$(document).ready(function () {
        async function waitForElm(selector) {
            return new Promise(resolve => {
                    if (document.querySelector(selector)) {
                            return resolve(document.querySelector(selector));
                    }

                    const observer = new MutationObserver(mutations => {
                            if (document.querySelector(selector)) {
                                    observer.disconnect();
                                    resolve(document.querySelector(selector));
                            }
                    });

                    // If you get "parameter 1 is not of type 'Node'" error, see https://stackoverflow.com/a/77855838/492336
                    observer.observe(document.body, {
                            childList: true,
                            subtree: true
                    });
            });
    }

    async function start(){
        var select = await waitForElm("pp_pricing_options");
        var plan = localStorage.getItem("Plan");
        plan = plan.replaceAll(/\s+/g, '');
        plan = plan.toLowerCase();
        plan = plan.charAt(0).toLocaleUpperCase() + plan.substring(1);
        for(var i = 0; i < select.length; i++)
        {
            if (select[i].text.includes(plan)){
                select[i].selected = true;
            }
        }
    } 
    start();
});

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

Что создает элемент?

evolutionxbox 14.08.2024 15:14

@evolutionxbox плагин сам создает элемент

Zaid Alnuami 14.08.2024 15:32

Плагин дает вам событие, когда он будет готов?

evolutionxbox 14.08.2024 17:25

нет, это не так

Zaid Alnuami 14.08.2024 17:41

Какой это плагин? Может быть, кто-нибудь сможет посмотреть и посмотреть, что мы можем посоветовать?

evolutionxbox 14.08.2024 17:42

@evolutionxbox вот этот. оплата.страница

Zaid Alnuami 15.08.2024 09:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать таймаут или просто загрузить скрипт в конце <body>

//Timeout Method
setTimeout ( function() {
    var select = document.getElementsByClassName("pp_pricing_options")[0];
    var plan = localStorage.getItem("Plan");
    plan = plan.replaceAll(/\s+/g, '');
    plan = plan.toLowerCase();
    plan = plan.charAt(0).toLocaleUpperCase() + plan.substring(1);
    for(var i = 0; i < select.length; i++)
    {
        if (select[i].text.includes(plan)){
            select[i].selected = true;
        }
    }
}, 1000); //change 1000 to the time delay you would like in milliseconds

Почему кто-то проголосовал против?

Iisrael 14.08.2024 14:55

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

Zaid Alnuami 14.08.2024 15:01
Ответ принят как подходящий

Рекомендую использовать повторяющийся setTimeout(). Таким образом, вы сможете проверять быстро и часто только до тех пор, пока элемент не загрузится:

{
 var check = () => {
  var select = document.getElementsByClassName("pp_pricing_options")[0];
  
  // Here you can check if any element was found.
  // If one wasn't found, call another setTimeout and cancel the rest of the code.
  if (!select) return setTimeout(check, 50);

  var plan = localStorage.getItem("Plan");
  plan = plan.replaceAll(/\s+/g, '');
  plan = plan.toLowerCase();
  plan = plan.charAt(0).toLocaleUpperCase() + plan.substring(1);
  for(var i = 0; i < select.length; i++) {
   if (select[i].text.includes(plan)) {
    select[i].selected = true;
   }
  }
 };

 // Start the first Timeout
 setTimeout(check, 50);
}

Другие вопросы по теме

WordPress: Как предотвратить использование функции одного плагина другим?
Javascript не работает должным образом в виджете Loop Grid (Elementor Pro)
Настраиваемое поле не отображается в ответе WordPress REST API
Используйте 2 десятичных знака для суммы скидки в Woocommerce с настройками 0 десятичных знаков
Страница индивидуальных заказов WooCommerce добавляет настраиваемое поле роли клиента
Добавить выбранное значение переключателя в качестве данных пользовательского элемента корзины через Ajax. Добавить в корзину в цикле продуктов WooCommerce
Woocommerce Проблема с крючками для одного продукта: заменить кнопку «Добавить в корзину»
Создание пользовательской кнопки добавления в корзину для переменных продуктов с вариациями в WooCommerce
Почему изображение с водяным знаком так сильно увеличивается в размере в WordPress?
Добавьте несколько суффиксов к отображаемым ценам продуктов WooCommerce