У меня есть шаблон элемента цикла, в котором, среди прочего, есть виджет кнопки (без щелчка по нему, используемый только для формы и простой в использовании), который извлекает значение настраиваемого поля из сообщения. Это значение представляет собой число от 0 до 100. Кнопка сопровождается скриптом, который меняет цвет кнопки в зависимости от ее значения.
Теперь вот проблема: При использовании этого шаблона для виджета сетки цикла скрипт работает только для первого поста в списке. Все остальные посты имеют стандартные цветные кнопки, не зависящие от значения в нем. Все остальное работает нормально. Моя единственная проблема заключается в том, чтобы этот javascript работал для каждого элемента виджета сетки цикла. Я пытался поместить скрипт не в шаблон элемента цикла, а на страницу, где будет использоваться виджет сетки цикла, но это тоже не работает.
У кнопки установлен идентификатор «myButton», и я подумал, что в этом и проблема, может быть, в последующих элементах сетки цикла кнопки теряют этот идентификатор?
Редактировать:
Я добавлю дополнительную информацию. Я не могу предоставить больше HTML, потому что для этого я в основном использую Elementor. Единственный код, который я написал, — это сценарий. Но я могу привести вам пример и пошаговый процесс, которому я следовал.
Допустим, у меня есть 3 сообщения, которые мы назовем postA, postB, postC.
У каждого сообщения есть настраиваемое поле (созданное с помощью плагина ACF), которое может отличаться от других сообщений или совпадать с ними. Это настраиваемое поле мы назовем «Число», и оно всегда имеет значение от 0 до 100 (целое число). postA имеет номер, равный 12, postB — 99, postC — 72.
Мое намерение состоит в том, чтобы создать с помощью Elementor «элемент цикла», который показывает имя сообщения. При этом настраиваемое поле «Число» внутри круга, цвет которого меняется в зависимости от значения самого «Числа».
Теперь, поскольку я не знаю, как взять значение «Число» через код, написанный непосредственно мной, и вместо создания элемента с текстом посередине в html, модифицируя его в виде круга и с конкретными цвета в CSS, я решил использовать виджет «Кнопка» Elementor, который позволяет мне легко брать значение «Число» из текущего сообщения, в котором оно находится, а также его легко изменить для создания круга со значением внутри него. Я пытаюсь этого добиться (конечно, я удалил возможность «нажимать» на кнопку и любую анимацию, сделав ее простым статическим кругом).
После этого мне оставалось создать скрипт, который будет динамически менять цвет кнопки. Написанный мной код, вставленный через виджет «HTML» Elementor, работает нормально, но только для первой найденной кнопки, поскольку я использую идентификатор, который должен быть уникальным.
Конечная цель состоит в том, чтобы вставить на страницу через виджет Elementor «Loop Grid» (где должен быть выбран только что созданный «Loop Item») список всех сообщений с их именем и настраиваемым полем. 'число'.
Следовательно, должно получиться что-то вроде:
Кнопка НЕ является настоящей кнопкой (нет опции щелчка, нет ссылки, при нажатии ничего не произойдет), я просто использую «кнопку» виджета elementor, чтобы легко поместить кружок, отредактировать его и легко получить внутри него значение «Число».
Понятно, что написанный мной скрипт работает только с первым элементом, ведь у postA есть кнопка, куда он вставляется, окрашенная в красный цвет. Однако у двух других, следующих за ними, есть кнопка, в которой настраиваемое поле «Номер» вставлено в общий цвет (тот, который установлен по умолчанию в самом виджете), а не как на изображении.
function getColor(value) {
const colors = {
0: '#F50000', 1: '#F50000', 2: '#F50000', 3: '#F50000', 4: '#F50000', 5: '#F50000', 6: '#F50000', 7: '#F50000', 8: '#F50000', 9: '#F50000',
10: '#F50000', 11: '#F50000', 12: '#F50000', 13: '#F50000', 14: '#F50000', 15: '#F50000', 16: '#F50000', 17: '#F50000', 18: '#F50000', 19: '#F50000',
20: '#F50000', 21: '#F50000', 22: '#F50000', 23: '#F50000', 24: '#F50000', 25: '#F50000', 26: '#F50000', 27: '#F50000', 28: '#F50000', 29: '#F50000',
30: '#F50000', 31: '#F50000', 32: '#F50000', 33: '#F50000', 34: '#F50000', 35: '#F50000', 36: '#F50000', 37: '#F50000', 38: '#F50000', 39: '#F50000',
40: '#F50000', 41: '#F50000', 42: '#F00000', 43: '#EB0000', 44: '#E60000', 45: '#E10000', 46: '#DC0000', 47: '#D70000', 48: '#D20000', 49: '#CD0000',
50: '#C80000', 51: '#C80A00', 52: '#C81400', 53: '#C81E00', 54: '#C82800', 55: '#C83200', 56: '#C83C00', 57: '#C84600', 58: '#C85000', 59: '#C85A00',
60: '#C86400', 61: '#C86E00', 62: '#C87800', 63: '#C88200', 64: '#C88C00', 65: '#C89600', 66: '#C8A000', 67: '#C8AA00', 68: '#C8B400', 69: '#C8BE00',
70: '#C8C800', 71: '#BEC800', 72: '#B4C800', 73: '#AAC800', 74: '#A0C800', 75: '#96C800', 76: '#8CC800', 77: '#82C800', 78: '#78C800', 79: '#6EC800',
80: '#64C800', 81: '#5AC800', 82: '#50C800', 83: '#46C800', 84: '#3CC800', 85: '#32C800', 86: '#28C800', 87: '#1EC800', 88: '#14C800', 89: '#0AC800',
90: '#00C800', 91: '#00CD00', 92: '#00D200', 93: '#00D700', 94: '#00DC00', 95: '#00E100', 96: '#00E600', 97: '#00EB00', 98: '#00F000', 99: '#00F500',
100: '#00FA00'
};
return colors[value];
}
function updateCircle() {
const button = document.getElementById('myButton');
const value = parseInt(button.innerText, 10);
const primaryColor = '#605BE5'; // primary color fixed
const secondaryColor = getColor(value);
button.style.backgroundImage = `linear-gradient(to bottom, ${primaryColor}, ${secondaryColor} 80%)`;
}
// Constantly update color
setInterval(updateCircle, 10);
<button id = "myButton">1</button>
Это html код одной кнопки (в примере это первая, 12 красных)
<div class = "elementor-element elementor-element-29412fc elementor-align-left elementor-widget elementor-widget-button" data-id = "29412fc" data-element_type = "widget" data-settings = "{"motion_fx_motion_fx_scrolling":"yes","motion_fx_devices":["desktop","tablet","mobile"]}" data-widget_type = "button.default">
<div class = "elementor-widget-container">
<div class = "elementor-button-wrapper">
<a class = "elementor-button elementor-size-md" role = "button">
<span class = "elementor-button-content-wrapper">
<span class = "elementor-button-text">12</span>
</span>
</a>
</div>
</div>
</div>
Я предлагаю вам также выйти const colors...
за пределы функции. Зачем создавать это каждый раз?
Вероятно, в этом и проблема, идентификатор должен быть уникальным. Но я не могу найти другого способа заставить скрипт работать с кнопкой, кроме использования идентификатора. Как еще я могу ссылаться на объекты «кнопки», делая их одинаковыми, имеющими одинаковый идентификатор, а затем применяя ко всем из них один и тот же сценарий?
Пожалуйста, опубликуйте больше HTML. Какой смысл в цикле с использованием setInterval? Есть ли идея присвоить каждой кнопке разный цвет? Тогда вы можете сделать это один раз. Непонятно, чего вы хотите. Вы можете присвоить кнопкам класс или просто посмотреть textContent, если он уникален.
Зайдите в свои инструменты разработки, скопируйте HTML-код с визуализированной страницы и добавьте его в вопрос. Кроме того, это не ответ, но если вы используете buttons
, ваш сайт не будет доступен пользователям, использующим клавиатуру, поскольку клавиатура будет фокусироваться на кнопках, которые ничего не делают.
Вот что, Я ДУМАЮ, вам нужно.
Когда на странице появится больше сообщений, вы получите больше кнопок.
Измените article.querySelector('.stratum-advanced-posts__post-thumbnail
на любой селектор, который вам подходит.
const updateCircle = () => {
Array.from(document.querySelectorAll('.elementor-element'))
.forEach(element => {
if (element.querySelector('.articleButton')) return; // already has a button
const val = element.querySelector('.elementor-button-text').textContent.trim();
element.innerHTML += `<button class = "articleButton">${val}</button>`
})
const buttons = document.querySelectorAll('.articleButton');
buttons.forEach((button, i) => {
const value = parseInt(button.textContent, 10);
const primaryColor = '#605BE5'; // primary color fixed
const secondaryColor = colors[value]; // find a better calculation depending on number of posts
button.style.backgroundImage = `linear-gradient(to bottom, ${primaryColor}, ${secondaryColor} 80%)`;
});
};
// Constantly update color
setInterval(updateCircle, 1000);
/* Testing
const section = document.querySelector('section');
const alphabet = Array.from({
length: 26
}, (_, i) => String.fromCharCode(65 + i));
const rndLetter = (array) => {
const randomIndex = Math.floor(Math.random() * array.length);
return array.splice(randomIndex, 1)[0];
}
const len = Object.keys(colors).length;
let tId = setInterval(() => {
const letter = rndLetter(alphabet);
if (alphabet.length === 0) {
clearInterval(tId);
return;
}
section.innerHTML += `<article id = "post-${letter}" class = "stratum-advanced-posts__post">
<div class = "stratum-advanced-posts__post-wrapper">
<img src = "https://placehold.co/50x80?text=POST ${letter} image" />
<div class = "stratum-advanced-posts__post-thumbnail">
${Math.floor(Math.random() * len)}</div>
</div>
</article>`
}, 1000)
*/
article button {
border-radius: 60%;
height: 40px;
}
article {
height: 100px;
background-color: yellow;
border: 1px solid black;
margin: 3px;
display: flex;
}
<div class = "elementor-element elementor-element-29412fc elementor-align-left elementor-widget elementor-widget-button" data-id = "29412fc" data-element_type = "widget" data-settings = "{"motion_fx_motion_fx_scrolling":"yes","motion_fx_devices":["desktop","tablet","mobile"]}"
data-widget_type = "button.default">
<div class = "elementor-widget-container">
<div class = "elementor-button-wrapper">
<a class = "elementor-button elementor-size-md" role = "button">
<span class = "elementor-button-content-wrapper">
<span class = "elementor-button-text">12</span>
</span>
</a>
</div>
</div>
</div>
<script>
const colors = {
0: '#F50000',
1: '#F50000',
2: '#F50000',
3: '#F50000',
4: '#F50000',
5: '#F50000',
6: '#F50000',
7: '#F50000',
8: '#F50000',
9: '#F50000',
10: '#F50000',
11: '#F50000',
12: '#F50000',
13: '#F50000',
14: '#F50000',
15: '#F50000',
16: '#F50000',
17: '#F50000',
18: '#F50000',
19: '#F50000',
20: '#F50000',
21: '#F50000',
22: '#F50000',
23: '#F50000',
24: '#F50000',
25: '#F50000',
26: '#F50000',
27: '#F50000',
28: '#F50000',
29: '#F50000',
30: '#F50000',
31: '#F50000',
32: '#F50000',
33: '#F50000',
34: '#F50000',
35: '#F50000',
36: '#F50000',
37: '#F50000',
38: '#F50000',
39: '#F50000',
40: '#F50000',
41: '#F50000',
42: '#F00000',
43: '#EB0000',
44: '#E60000',
45: '#E10000',
46: '#DC0000',
47: '#D70000',
48: '#D20000',
49: '#CD0000',
50: '#C80000',
51: '#C80A00',
52: '#C81400',
53: '#C81E00',
54: '#C82800',
55: '#C83200',
56: '#C83C00',
57: '#C84600',
58: '#C85000',
59: '#C85A00',
60: '#C86400',
61: '#C86E00',
62: '#C87800',
63: '#C88200',
64: '#C88C00',
65: '#C89600',
66: '#C8A000',
67: '#C8AA00',
68: '#C8B400',
69: '#C8BE00',
70: '#C8C800',
71: '#BEC800',
72: '#B4C800',
73: '#AAC800',
74: '#A0C800',
75: '#96C800',
76: '#8CC800',
77: '#82C800',
78: '#78C800',
79: '#6EC800',
80: '#64C800',
81: '#5AC800',
82: '#50C800',
83: '#46C800',
84: '#3CC800',
85: '#32C800',
86: '#28C800',
87: '#1EC800',
88: '#14C800',
89: '#0AC800',
90: '#00C800',
91: '#00CD00',
92: '#00D200',
93: '#00D700',
94: '#00DC00',
95: '#00E100',
96: '#00E600',
97: '#00EB00',
98: '#00F000',
99: '#00F500',
100: '#00FA00'
};
</script>
Нет, я не это имел в виду, спасибо за попытку. Я отредактировал вопрос, может это поможет понять ситуацию.
Хорошо, смотри обновление....
Я добавил для тебя тест
все же я не это имею в виду, я сделал изображение, чтобы лучше понять конечный результат
Ок, посмотри еще раз.....
я думаю, что это может быть правильный путь, но что вы имеете в виду: «Измените селекторarticle.querySelector('.stratum-advanced-posts__post-thumbnail на любой селектор, который вам подходит»? Должен ли я вставить сюда код для получения настраиваемое поле сообщения? Если да, то я действительно не знаю, как это сделать?
Каков был ваш план? Если вы не показываете настоящий HTML-код и не знаете, как это сделать самостоятельно, как мы сможем помочь? Я даже зашел на сайт, на котором ИСПОЛЬЗУЕТСЯ Elementor, чтобы попытаться найти какой-нибудь HTML-код, с которым я мог бы работать. Я почти уверен, что у него были другие классы, чем у вас, отсюда и мой комментарий. Вам нужно щелкнуть правой кнопкой мыши нужный номер и затем нажать «Проверить». Затем вы увидите HTML и классы, которые могут привести вас к селектору, который вы сможете использовать.
добавлен html код виджета
Хорошо, взгляните на мое обновление
Я сделал вам фрагмент. Добавьте соответствующий HTML и CSS и обратите внимание, что идентификаторы должны быть уникальными.