Я пробую приведенный ниже код, но получаю неопределенную «длину», потому что элемент в выборе еще не создан, потому что я использую плагин, и этот элемент находится внутри этого шаблона плагина, и плагину требуется немного больше времени для загрузки после загрузки 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 плагин сам создает элемент
Плагин дает вам событие, когда он будет готов?
нет, это не так
Какой это плагин? Может быть, кто-нибудь сможет посмотреть и посмотреть, что мы можем посоветовать?
@evolutionxbox вот этот. оплата.страница



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать таймаут или просто загрузить скрипт в конце <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
Почему кто-то проголосовал против?
не знаю, кто проголосовал против, но в любом случае это решение проблематично, потому что мне нужно, чтобы оно сработало, как только элемент загрузится. поэтому, если у вас плохое подключение к Интернету, это может занять более 1000 мс, или если у вас быстрый Интернет, возможно, это займет меньше, поэтому я не могу установить конкретное время, а только жду самого элемента
Рекомендую использовать повторяющийся 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);
}
Что создает элемент?