add_action( 'template_redirect', function(){
ob_start( function( $buffer ){
$buffer = str_replace( array( 'type="text/javascript"', "type='text/javascript'" ), '', $buffer );
$buffer = str_replace( array( 'type="text/css"', "type='text/css'" ), '', $buffer );
return $buffer;
});
});
const classPrefix = 'modal--';
Array.from(el.classList).forEach(n => el.classList.toggle(n, !!n.indexOf(classPrefix)));
el.classList.remove(...[...el.classList].filter(n => n.startsWith(classPrefix)));
for (let i = el.classList.length; i--;) {
if (el.classList[i].search(classPrefix) === 0) {
el.classList.remove(el.classList[i]);
}
}
el.classList.value = el.classList.value
.split(' ')
.filter(RegExp.prototype.test.bind(RegExp(`^(?!${classPrefix})`)))
.join(' ');
el.className = el.className.replace(RegExp(`(^| )${classPrefix}\\S*`, 'g'), '').trim();
const blockSelector = 'селектор блоков';
const buttonSelector = 'селектор кнопок';
const activeClass = 'класс, показывающий блок';
const blocks = document.querySelectorAll(blockSelector);
const buttons = document.querySelectorAll(buttonSelector);
buttons.forEach((n, i) => {
n.addEventListener('click', () => {
blocks[i].classList.toggle(activeClass);
});
});
const onClick = function({ currentTarget: { dataset: { index } } }) {
this[index].classList.toggle(activeClass);
}.bind(document.querySelectorAll(blockSelector));
document.querySelectorAll(buttonSelector).forEach((n, i) => {
n.dataset.index = i;
n.addEventListener('click', onClick);
});
const blocks = document.querySelectorAll(blockSelector);
const buttons = document.querySelectorAll(buttonSelector);
buttons.forEach(n => n.addEventListener('click', onClick));
function onClick() {
const index = Array.prototype.indexOf.call(buttons, this);
blocks[index].classList.toggle(activeClass);
}
const containerSelector = '...';
), то индексы не нужны. Достаточно от нажатой кнопки подняться до общего предка кнопки и блока, и найти внутри блок (а можно даже и не искать, если добавлять класс контейнеру; конечно, стили придётся в этом случае немного изменить, вместо .блок.класс
будет .контейнер.класс .блок
):const toggleBlock = button => button
?.closest(containerSelector)
?.querySelector(blockSelector)
.classList
.toggle(activeClass);
// можно добавить обработчик клика каждой кнопке индивидуально
document.querySelectorAll(buttonSelector).forEach(function(n) {
n.addEventListener('click', this);
}, e => toggleBlock(e.currentTarget));
// или один раз на всю страницу
document.addEventListener('click', e => {
toggleBlock(e.target.closest(buttonSelector));
});
// Пусть, список будет в строке разделенной вертикальной чертой
"contacts|goods|gallery|reviews|screen".split`|`
// Находим каждый элемент
.map(data=>document.querySelector(`.blocks__item[data-item="${data}"]`))
// Вешаем на элементы событие mouseenter
.forEach(el=>el.addEventListener('mouseenter',e=>{
// Класс активного элемента надо удалить только у активного элемента
document.querySelector`.blocks__item.blocks__item--active`.classList.remove`blocks__item--active`;
// А элементу, вызвавшему это событие надо добавить класс активности
e.target.classList.add`blocks__item--active`;
// Еще где-то какому-то элементу присвоим класс, частично формирующийся из атрибута элемента события
document.querySelector`.blocks__phone-bg`.className = `blocks__phone-bg blocks__phone-bg--${e.target.getAttribute`data-item`}`;
});
// Вот и все!
const tags = ['screen', 'goods', 'gallery', 'reviews', 'contacts'];
function enableBlock(blockTag) {
document.querySelector('.blocks__phone-bg').classList.add(`blocks__phone-bg--${blockTag}`);
document.querySelector('.blocks__phone-bg').className = `blocks__phone-bg blocks__phone-bg--${blockTag}`;
tags.forEach(tag=>{
let elem = document.querySelector(`.blocks__item[data-item="${tag}"]`);
if (!elem){
return;
};
if (blockTag===tag){
elem.classList.add('blocks__item--active');
}else{
elem.className = 'blocks__item';
};
});
}
childNodes
.node.nodeType === Node.TEXT_NODE
node.nodeValue
работать как со строкой текста – заменить/убрать искомый символ.childNodes
<?php
woocommerce_template_single_add_to_cart();
?>
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
if ( ! function_exists( 'single_add_to_cart_wrapper_start' ) ) {
function single_add_to_cart_wrapper_start() {
?>
<div class="product_footer">
<?php
}
}
if ( ! function_exists( 'single_add_to_cart_wrapper_end' ) ) {
function single_add_to_cart_wrapper_end() {
?>
</div>
<?php
}
}
add_action( 'woocommerce_after_single_product_summary', 'single_add_to_cart_wrapper_start', 1 );
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_template_single_add_to_cart', 3 );
add_action( 'woocommerce_after_single_product_summary', 'single_add_to_cart_wrapper_end', 5 );
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
if ( ! function_exists( 'single_add_to_cart_in_footer' ) ) {
function single_add_to_cart_in_footer() {
?>
<div class="product_footer">
<?php woocommerce_template_single_add_to_cart(); ?>
</div>
<?php
}
}
add_action( 'woocommerce_after_single_product_summary', 'single_add_to_cart_in_footer', 5 );
const selector = 'селектор элементов';
const className = 'класс';
const minChildrenCount = 666;
for (const n of document.querySelectorAll(selector)) {
n.classList.toggle(className, n.children.length >= minChildrenCount);
}
// или (нет, так делать точно не надо - для 0 результат будет некорректным)
document
.querySelectorAll(`${selector} > :nth-child(${minChildrenCount})`)
.forEach(n => n.parentNode.classList.add(className));
const simpleString = '7911xxxxxxx';
const validateStr = (str) => {
let result = '';
if (typeof str !== 'string') throw 'Parameter is not a string!';
if (str.length >= 10) throw 'Phone is incorrect!';
if (str[0] === '7') result = '+' + str;
return str;
}