class Hamburger {
static SMALL = 'small';
static TOPPING_CHEESE = 'cheese';
// ...
// если первый символ не тот, прилепить его в начале
const keepPlus = event => {
const symbol = '+';
const {target} = event; // const target = event.target;
if (target.value[0] !== symbol) {
target.value = symbol + target.value;
}
}
// проверять при любом изменении
document.querySelectorAll('input[type=text]')
.forEach(el => el.addEventListener('input', keepPlus));
Здесь недостаток – помимо начального плюсика все прочие хотелки игнорируются. Например, юзер введёт ещё сотню плюсиков после первого, номер из всего 2 цифр и забудет указать код города. Юзеры они такие.input type="tel"
и его атрибут pattern
. Песочница.// JSON, типа
const data = [
{id: 1, text: 'я'},
{id: 2, text: 'буду'},
{id: 3, text: 'задавать умные вопросы'},
];
data.forEach(item => {
document.body.insertAdjacentHTML('beforeend', `
<div id="${item.id}">
—> <strong>${item.text}</strong> <—
</div>
`);
});
let isInIframe;
try {
isInIframe = window.self !== window.top;
} catch (e) {
isInIframe = true;
}
if (isInIframe) {
// мы в айфрейме
}
Дальше можно запрашивать, например, основной контент страницы, добавив параметры к запросу https://example.com/page.php?iframe=1
model
необходимо передать одну из готовых моделей. Поиском нашлись, например, модели richardpl/arnndn-modelsconst sum = number => {
if (number < 0) return 0;
// вспомогательная функция считает сумму ряда с шагом step
const sequenceSum = step => {
const q = Math.floor(number / step);
return q * (q + 1) * step / 2;
}
return sequenceSum(3) + sequenceSum(5) - sequenceSum(3 * 5);
}
// использование
sum(999999) // мгновенно: 233333166668
const sum = number => {
if (number < 0) return 0;
// вспомогательная функция считает сумму ряда с шагом step
const sequenceSum = step => {
const q = Math.floor(number / step);
return q * (q + 1) * step / 2;
}
return sequenceSum(3) + sequenceSum(5) - sequenceSum(3 * 5);
}
sum(18) // 78
h = g * t^2 / 2
, где g — постоянная, ускорение свободного падения. В игре не метры, а пиксели, и надо подобрать значение константы, чтобы не слишком быстро, не слишком медленно ускорялось тело. На глаз.update()
. Это достаточно сделать только 1 раз.let startTime = Date.now();
// Функция Прыжка
const moveUp = () => {
ghost.y -= 50;
startTime = Date.now();
};
document.addEventListener('keydown', moveUp);
function update() {
// Физика
const dt = Date.now() - startTime;
ghost.y += dt ** 2 / 100; // подобрать число
// Границы
ghost.x = Math.min(900, Math.max(0, ghost.x));
ghost.y = Math.min(650, Math.max(0, ghost.y));
}
new Array(15).fill('').map((_, i) => i / 3 & 1 ? '+' : '-').join(',')
"-,-,-,+,+,+,-,-,-,+,+,+,-,-,-"
new Array(15).fill().map((_, i) => i)
.reduce((acc, c, i) => {
if (i % 3 === 0) acc.push([]);
acc[acc.length - 1].push(c);
return acc;
}, []);
// "[[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]]"
e.target
— увидите, что за элемент поймал клик.<div class="burger">
<span>Какой-то текст</span>
</div>
тут часть кликов поймает не div
, а span
. Но, если добавить span'у CSS-свойство pointer-events: none;
, он перестанет взаимодействовать с мышкой, и все клики отловятся именно div'ом, как и задумывалось. toCurrency(100500, 'BYN', 'be-BY')
у меня возвращает строку "100 500,00 Br"
toCurrency(100500, 'BYN', 'ru-BY');