const options = {
root: null,
rootMargin: '0px',
threshold: 0.05
};
const lazyload = function(entries, observer) {
entries.forEach(function(entry) {
const target = entry.target;
const dataset = target.dataset;
if (entry.isIntersecting) {
try {
if ('src' in dataset) {
target.src = dataset.src;
}
if ('bg' in dataset) {
target.style.backgroundImage = `url(${dataset.bg})`;
}
target.classList.add('lazyloaded');
observer.unobserve(target);
} catch (error) {
console.error(error);
}
}
});
};
const observer = new IntersectionObserver(lazyload, options);
document.querySelectorAll('.js-lazyload').forEach(elem => observer.observe(elem));
<!-- Изображение без плейсхолдера -->
<img class="js-lazyload" data-src="path/to/image/elephant.jpg" alt="The pink elephant">
<!-- Изображение с плейсхолдером -->
<img class="js-lazyload" data-src="path/to/image/elephant.jpg" src="path/to/placeholder.jpg" alt="The pink elephant">
<!-- Ситуация, когда изображение надо задать как фон -->
<div class="js-lazyload" data-bg="path/to/image/elephant.jpg"></div>
.full {
width: 100vw;
position: relative;
margin-left: -50vw;
left: 50%;
margin-bottom: 30px;
}
############################################################################
#### Cтандартный .htaccess для проектов студии Клондайк, версия 2.3 ####
############################################################################
RewriteEngine On
# Директива включает редиректы.
RewriteBase /
# Без директивы (.*) = /$1 будет /var/wwww/site/web/$1 с директивой = /$1
Options +FollowSymLinks
# Разрешает переход по символическим ссылкам.
############################################################################
#### Перенаправляем протокол https на http ####
############################################################################
RewriteCond %{HTTPS} on
# Проверяем наличие https в URL.
RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI}
# Перенаправляем протокол на http.
############################################################################
#### Выбор основного зеркала (или с www или без www) ####
############################################################################
# 1. Редирект с www на без www. (раскоментировать директивы пункта 1)
#RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
# Проверяем, содержит ли домен www (в начале URL).
#RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
# Перенаправляем URL на домен без www.
####
# 2. Редирект без www на www. (раскоментировать директивы пункта 2)
#RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
# Проверяем, не содержит ли домен www (в начале URL).
#RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
# Перенаправляем URL на домен c www.
############################################################################
#### Убираем повторяющиеся слеши (/) в URL ####
############################################################################
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
# Проверяем, повторяется ли слеш (//) более двух раз.
RewriteRule . %1/%2 [R=301,L]
# Исключаем все лишние слеши.
############################################################################
#### Убираем слеши в конце URL для статических файлов (содержит точку) ####
############################################################################
RewriteCond %{REQUEST_URI} \..+$
# Если файл содержит точку.
RewriteCond %{REQUEST_FILENAME} !-d
# И это не директория.
RewriteCond %{REQUEST_FILENAME} -f
# Является файлом.
RewriteCond %{REQUEST_URI} ^(.+)/$
# И в конце URL есть слеш.
RewriteRule ^(.+)/$ /$1 [R=301,L]
# Исключить слеш.
############################################################################
#### Добавляем слеш(/), если его нет, и это не файл. ####
############################################################################
RewriteCond %{REQUEST_URI} !(.*)/$
# Если слеша в конце нет.
RewriteCond %{REQUEST_FILENAME} !-f
# Не является файлом.
RewriteCond %{REQUEST_URI} !\..+$
# В URL нет точки (файл).
RewriteRule ^(.*)$ $1/ [L,R=301]
# Добавляем слеш в конце.
############################################################################
#### Убираем index.php, если он есть в конце URL ####
############################################################################
RewriteCond %{REQUEST_METHOD} =GET
# Выявляем GET запрос в URL (не POST).
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
# URL cодержит index.php в конце.
RewriteRule ^(.*)$ %1/ [R=301,L]
# Удалить index.php из URL.
############################################################################
#### Конец общей части, далее следует собственные директивы .htaccess ####
############################################################################
$.fn.glow = function(delay = 1000) {
return this.each(function() {
let interval;
const startGlow = () => {
interval = setInterval(() => $(this).toggleClass('glow'), delay);
}
const stopGlow = () => {
clearInterval(interval);
}
$(this).on('mouseenter', stopGlow);
$(this).on('mouseleave', startGlow);
startGlow();
return this;
})
}
$('.glowable').glow();
::-moz-scrollbar
, но для элемента можно сделать scrollbar-width: none;
:div {
max-height: 120px;
overflow-y: auto;
overflow-x: none;
scrollbar-width: none;
}
div::-webkit-scrollbar {
display: none;
}
scrollbar-width
, и скролбар после этого исчезает корректно в Firefox. const quantityElement = document.querySelector('#quantityitog');
const plusButtonElement = document.querySelector('#plustab');
const minusButtonElement = document.querySelector('#minustab');
const totalElement = document.querySelector('#totalprice');
const priceElement = document.querySelector('#countprice');
let total = +totalElement.innerText;
let qty = +quantityElement.innerText;
let price = +priceElement.innerText;
function updateView(){
totalElement.innerHTML = total;
}
function increment(){
qty++;
total = Math.trunc((qty * price) * 100) / 100;
updateView();
}
function decrement(){
qty--;
total = Math.trunc((total - price) * 100) / 100;
if (total < 0) total = 0;
updateView();
}
plusButtonElement.addEventListener('click', increment)
minusButtonElement.addEventListener('click', decrement)
Просто актуальной инфы так мало по этому, а я вылез из 2015 года.
map
, filter
, some
и т.д.), принимающую элемент массива и возвращающую true
в случае, если элемент должен быть удалён. Если элемент удалять не надо, то следует обработать массив вложенных элементов - выполняется рекурсивный вызов. Как это может выглядеть:function deleteNested(arr, fn) {
arr?.reduceRight?.((_, n, i, a) =>
fn(n, i, a)
? a.splice(i, 1)
: deleteNested(n.children, fn)
, null);
}
function deleteNested(arr, fn) {
if (Array.isArray(arr)) {
arr.splice(0, arr.length, ...arr.filter((n, i, a) => {
return !fn(n, i, a) && (deleteNested(n.children, fn), true);
}));
}
}
function deleteNested(arr, fn) {
if (arr instanceof Array) {
let numDeleted = 0;
for (const [ i, n ] of arr.entries()) {
if (fn(n, i, arr)) {
numDeleted++;
} else {
arr[i - numDeleted] = n;
deleteNested(n.children, fn);
}
}
arr.length -= numDeleted;
}
}
deleteNested(itemsData, n => n.id === id_объекта_который_надо_удалить);
const remove = str => str.split(' ').slice(0, -1).join(' ');
// или
const remove = str => str.replace(/\s\S+$/, '');
// или
const remove = str => str.match(/.+(?=\s)/);
// или
const remove = str => str.slice(0, str.lastIndexOf(' '));
for (const n of document.getElementsByClassName('startdate')) {
n.textContent = remove(n.textContent);
}
// или, раз уж полной даты уже не будет, пусть начало и конец интервала дат
// располагаются внутри одного элемента - вместе с куском строки также
// удаляем и родительский элемент
document.querySelectorAll('.startdate').forEach(n => {
n.outerHTML = remove(n.innerHTML);
// или
n.replaceWith(remove(n.innerText));
});