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.addEventListeneropenBlock и backBlock не меняются, их можно вместо let объявить constdocument.querySelector('.hidden-block') наверное, не имеет смысла, достаточно один раз, заранее const hiddenBlock = document.querySelector('.hidden-block');и далее обращаться к этой константе hiddenBlock.pet_1 = { name: "Шарик", age: 10 };
pet_2 = { name: "Жучка", age: 5 };
function getName() {
return [this.name, this.age].join(' ');
}
pet_1.getName = getName;
pet_2.getName = getName;
pet_1.getName(); // Шарик 10
pet_2.getName(); // Жучка 5pet_1 = { name: "Шарик", age: 10 };
pet_2 = { name: "Жучка", age: 5 };
function getName() {
return [this.name, this.age].join(' ');
}
const mixin = { getName };
Object.assign(pet_1, mixin);
Object.assign(pet_2, mixin);
pet_1.getName(); // Шарик 10
pet_2.getName(); // Жучка 5Подготовить объект с единственным свойством "getName" в котором лежит одноимённая функция. Скопировать все свойства (в данном случае одно) этого объекта поверх существующих свойств объектов pet_1 и pet_2 с помощью Object.assign().reduce() в копилку:const zip = (arr1, arr2) => arr1.reduce(
(acc, head, i) => (acc.push({ ...arr2[i], head }), acc),
[]
);zip(mass1, mass2)
/* [
{ t1: "aa", p1: "lot", head: "zn1" },
{ t1: "ab", p1: "kot", head: "zn2" },
{ t1: "ac", p1: "mot", head: "zn3" },
] */map() тут больше подходит:mass1.map((head, i) => ({ head, ...mass2[i] })) window.isLoaded = false;
window.addEventListener('load', () => {
window.isLoaded = true;
});
window.isQueued = false; // уже ждём в очереди?
function nowOrLater() {
if (!window.isLoaded) {
if (!window.isQueued) {
window.addEventListener('load', nowOrLater);
window.isQueued = true;
}
return;
}
// тут код котовый выполнить только после
} const Main = styled.main`
background-color: black;
height: 100vh;
`
function App(props) {
const { message } = props;
return (
<Main>
<div className="App">
{message}
</div>
</Main>
);
}