const oo = n => n.toString().padStart(2, '0');
const formatDate = date => {
const d = new Date(date);
const month = oo(d.getMonth() + 1);
const day = oo(d.getDate());
const year = d.getFullYear();
return [year, month, day].join('-');
};
const onMessage = (data, cred) => {
const { time_mark: timeMark, id, nick, content } = data;
const { nick: credNick } = cred;
const msgDate = formatDate(timeMark);
const currentDate = formatDate(new Date());
const date = new Date(timeMark); // 2009-11-10
const time = [date.getHours(), date.getMinutes()].map(oo).join(':');
let Strtime;
if (msgDate === currentDate) {
Strtime = 'Сегодня в ' + time;
} else {
const month = date.toLocaleString('default', { month: 'long' });
Strtime = `${oo(date.getDay())} ${month} ${date.getFullYear()}, в ${time}`;
}
$('#msg-container').append(`
<div class="msg-box" id='${id}' class="${nick === credNick ? '' : 'not-my'}">
<p class="author">${nick}</p>
<p class="msg-text">${content}</p>
<span class="time">${Strtime}</span>
</div>
`);
};
$(document).ready(() => {
check();
const socket = io();
const cred = JSON.parse(localStorage.getItem('userData'));
$.ajax({
url: '/getmessage',
type: 'POST',
success({ status, msg, data }) {
if (status === 'err') {
return new Notification('Ошибка', { body: msg });
}
data.forEach(message => onMessage(message, cred));
$('#all_mess').scrollTop($('#msg-container').height());
},
});
socket.emit('hello', { nick: cred.nick });
$('#messForm').submit(e => {
e.preventDefault();
const msg = $('#message').val();
if (msg) {
socket.emit('sendMess', { token: localStorage.getItem('token'), msg });
$('#message').val('');
}
});
socket.on('addMess', data => {
onMessage(data, cred);
$('#all_mess').scrollTop($('#msg-container').height());
});
socket.on('toLogin', () => {
window.location.href = '/auth';
});
socket.on('helloMess', str => {
$('#msg-container').append(`<span class="hello">${str.mess}</span>`);
$('#all_mess').scrollTop($('#msg-container').height());
});
});
function hideEl() {
$('.hello').hide();
}
this.selectedNodesInfo = selectedItems.map(({ id, IADDRESS_LEVELID, [fieldName]: name }) => {
const result = { name: name ?? id, id };
if (this.isAddress) {
result.IADDRESS_LEVELID = IADDRESS_LEVELID;
}
return result;
});
this.selectedNodesInfo = selectedItems.map(({ id, IADDRESS_LEVELID, [fieldName]: name }) => ({
name: name ?? id,
id,
...(this.isAddress ? { IADDRESS_LEVELID } : null),
}));
const params = (new URL(document.location)).searchParams;
const utmCampaign = params.get('utm_campaign');
const campaignTexts = {
'vk_001': 'Привет, куплю ваших слонов в ВК!',
'vk_002': 'Привет, куплю ваших слонов в группе!',
'fb_001': 'Привет, куплю ваших слонов в Facebook!',
};
const text = encodeURIComponent(campaignTexts[utmCampaign] ?? 'Привет по умолчанию!');
const randomUrl = `https://wa.me/${phone}?text=${text}`;
const phones = [
{ p: '9171857450', c: 1 },
{ p: '9880735438', c: 10 },
{ p: '9880735439', c: 100 },
{ p: '9880735779', c: 2 },
{ p: '9170997305', c: 2 },
{ p: '9170997493', c: 2 },
{ p: '9880634879', c: 5 },
{ p: '9170996154', c: 1 },
{ p: '9880728447', c: 1 },
];
const chancesTotal = phones.reduce((acc, { c }) => acc + c, 0);
const selected = Math.floor(Math.random() * chancesTotal);
let phone;
for (let i = 0, sum = 0; i < phones.length; i++) {
sum += phones[i].c;
if (selected < sum) {
phone = phones[i].p;
break;
}
}
const randomUrl = `https://wa.me/${phone}?text=Привет!%20Пришлите%20мне%20цены%20на%20рыбку!`;
const arr = [0, 1, 2, 3, 4, 5];
const index = 3;
[ ...arr.slice(0, index), 'Habr', ...arr.slice(index + 1) ]
// [ 0, 1, 2, "Habr", 4, 5 ]
Делается новый массив, в котором сначала идут элементы исходного от 0
до index
(не включая index);index
на некий новый. В отличие от метода splice()
, которым можно было бы сделать тоже самое arr.splice(index, 1, 'Habr')
, вариант в вопросе не изменяет исходный массив, а создаёт новый – что, в общем-то, «правильно». const sortUp = () => {
const parent = document.querySelector('div.t-input-phonemask__options-wrap > noindex');
const goFirst = ['ru', 'ua', 'kz'];
goFirst.reverse().forEach(cc => {
parent.insertAdjacentElement('afterbegin', parent.querySelector('#t-phonemask_' + cc));
});
};
setTimeout(sortUp, 1000);
P.S. стоит Тильде чуть что-то поменять, изменить названия классов — перестанет работать. {n,m}
./5{1,3}/
соответствует цифре 5 повторяющейся от 1 до 3 раз.const re = /(([1-68])\2{0,2}|([79])\3{0,3}|0)/g;
"443777771999990005555551".match(re).join(', ')
// "44, 3, 7777, 7, 1, 9999, 9, 0, 0, 0, 555, 555, 1"
(A|B|C) == "A" ИЛИ "B" ИЛИ "C"
[a-z] == любой один от "a" до "z"
[1-68] == цифра от 1 до 6 или 8
\2
или например \3
– отсылка к ранее захваченному в круглых скобках фрагменту/([79])\2{0,2}/
цифра 7 или 9. Сразу после неё – её же повтор от 0 до 2 раз. Т.е. в сумме это цифра 7 или 9, идущая до 3 раз подряд. `
:$('#bombfire').html(`
<svg>...</svg>
`);
Только в обратных "бэк-тиках" можно текст разбивать на строки. Подробнее про строки и кавычки.const str = ' \
line 1 \
line 2 \
';
[ 1, 0, 0, 0, 0 ] Как
[ 0, 1, 0, 0, 0 ] нейросети
[ 0, 0, 1, 0, 0 ] обрабатывают
[ 0, 0, 0, 1, 0 ] текстовую
[ 0, 0, 0, 0, 1 ] информацию
i
уже начинает указывать на следующий,for()
увеличит i
ещё на 1, и получится, что 1 элемент пропустили. Чинится уменьшением i
на 1 сразу после удаления 1 элемента.i
должно быть не меньше-или-равно, а меньше, чем длина массива.indexOf(value)
const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
function funcDeleteDuplicate(array) {
for (let i = 0; i < array.length; i++) {
if (array.indexOf(array[i]) !== i) {
array.splice(i, 1);
i--;
}
}
return array;
}
console.log(funcDeleteDuplicate(duplicateArray));
// [ "a", "b", "c", "q" ]
const funcDeleteDuplicate = array => [...new Set(array)];
imageClone.onload = imageLoaded;
function nextActions() {
vars();
anim();
slider();
}
// ...
// внутри колбэка imageLoaded:
if (!preloader.classList.contains('done')) {
preloader.classList.add('done');
nextActions(); // запустить следующие анимации
}
tv-symbol-price-quote__value js-symbol-last
там — пустой. Это после обработки в браузере JS, в тот элемент попадает обновляемое значение котировки./**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
backBlock.addEventListener
добавляется внутри обработчика клика. Т.е. каждый раз, как нажимаем на openBlock
, вешается ещё и ещё один обработчик на backBlock
. Достаточно один раз, заранее, так же как сейчас openBlock.addEventListener
openBlock
и backBlock
не меняются, их можно вместо let
объявить const
document.querySelector('.hidden-block')
наверное, не имеет смысла, достаточно один раз, заранее const hiddenBlock = document.querySelector('.hidden-block');
и далее обращаться к этой константе hiddenBlock
.