← Все статьи

Туториалы

Отключаем тёмные паттерны: фальшивую срочность и скрытые галочки

«Осталось всего 2 штуки». «Прямо сейчас это смотрят 12 человек». Таймер обратного отсчёта, который сбрасывается при каждой перезагрузке. Заранее проставленная галочка, добавляющая страховку, которую ты не просил. Это тёмные паттерны — интерфейсные трюки, созданные, чтобы поторопить и обхитрить тебя. Эта статья показывает, как нейтрализовать самые частые из них с помощью CSS и JavaScript, чтобы ты делал покупки с ясной головой.

Что считается тёмным паттерном

Тёмный паттерн — это решение интерфейса, которое выгодно бизнесу за твой счёт, эксплуатируя то, как работают внимание и значения по умолчанию. Те, что стоит обезвредить на странице магазина:

Ты не можешь помешать сайту быть так спроектированным, но можешь отредактировать то, как он рендерится в твоём браузере.

Как распознать фальшивый отсчёт

Настоящий дедлайн одинаков для всех и переживает перезагрузку. Фальшивый — сбрасывается. Быстрый тест: запомни таймер, перезагрузи страницу, посмотри снова. Если он прыгнул назад на «05:00» — это театр. Открой DevTools, панель Elements, и найди элемент, чей текст тикает вниз, — запомни его класс.

Прячем виджеты фальшивой срочности с помощью CSS

Самое быстрое решение — заставить виджеты давления исчезнуть полностью. Они почти всегда аккуратно отделены и названы так, как они есть на самом деле:

/* Fake urgency, scarcity and social-proof widgets */
.countdown-timer,
.sale-timer,
.urgency-banner,
.stock-warning,
.low-stock,
.viewing-now,
.recently-viewed-count,
[class*="countdown" i],
[class*="urgency" i],
[class*="scarcity" i],
[class*="viewers" i],
[class*="people-viewing" i] {
  display: none !important;
}

Как всегда, флаг i делает совпадение по атрибутам регистронезависимым. Начни с этого блока; он мгновенно убирает видимый шум на большинстве торговых страниц.

Замораживаем отсчёт вместо того, чтобы прятать его

Иногда хочется видеть, что распродажа существует, но не подгоняться тикающими часами. Заморозь их: останови скрипт, который их обновляет. Грубый, надёжный подход — нейтрализовать функции таймеров до того, как стартует скрипт страницы, на document_start:

// Freeze countdowns: defang the timers the page uses to tick
const realSetInterval = window.setInterval;

window.setInterval = function (fn, delay, ...args) {
  // Block fast-ticking timers (countdowns update ~every second)
  if (delay && delay <= 1000) {
    console.log('[dark-patterns] blocked a 1s interval');
    return -1;            // a harmless fake id
  }
  return realSetInterval.call(this, fn, delay, ...args);
};

Это намеренно широко — оно останавливает каждый интервал короче секунды, который на странице товара почти всегда является отсчётом. Если оно заморозит что-то нужное, сузь его, проверяя fn.toString() на ключевые слова вроде countdown перед блокировкой.

Более мягкая альтернатива: дай таймеру работать, но один раз закрепи отображаемый текст, а затем останови обновления этого узла:

// Pin the countdown text and stop it changing
const timer = document.querySelector('[class*="countdown" i]');
if (timer) {
  const frozen = timer.textContent;
  new MutationObserver(() => {
    if (timer.textContent !== frozen) timer.textContent = frozen;
  }).observe(timer, { childList: true, subtree: true, characterData: true });
}

Снимаем скрытые галочки допов

Самый дорогой тёмный паттерн — заранее проставленная галочка: страховка доставки, «округлить в пользу благотворительности», повторяющееся членство. Она отмечена по умолчанию и сформулирована так, чтобы ты проскользнул мимо. Сними их с помощью JavaScript после загрузки страницы:

// Un-tick pre-checked add-on checkboxes
function unchargeMe() {
  document.querySelectorAll('input[type="checkbox"]:checked')
    .forEach(box => {
      const label = (box.closest('label')?.textContent
        || box.parentElement?.textContent || '').toLowerCase();

      // Only touch boxes that smell like a paid add-on
      if (/insurance|protection|warranty|donation|round up|express|priority|membership|subscribe/.test(label)) {
        box.checked = false;
        // Fire events so the page recalculates the total
        box.dispatchEvent(new Event('change', { bubbles: true }));
        box.dispatchEvent(new Event('input', { bubbles: true }));
        console.log('[dark-patterns] un-checked:', label.trim().slice(0, 60));
      }
    });
}

unchargeMe();
// Re-run when the cart re-renders
new MutationObserver(unchargeMe)
  .observe(document.body, { childList: true, subtree: true });

События change и input важны — без них итог страницы может по-прежнему включать доп, хотя галочка выглядит снятой. Всегда проверяй, что цена обновилась.

Обезвреживаем формулировки confirmshaming

Переписать текст легко не получится, но можно помешать confirmshaming делать своё дело: сделай вариант отказа таким же заметным и нейтральным, как вариант согласия. Если сайт стилизует «Нет, спасибо» как крошечный серый текст, перестилизуй его:

/* Make the decline link a normal, readable button */
.modal a[class*="decline" i],
.modal button[class*="dismiss" i],
[class*="confirm-shame" i] {
  font-size: 1rem !important;
  color: inherit !important;
  text-decoration: underline !important;
  opacity: 1 !important;
}

Ограничиваем область действия с помощью JustZix

Часть этих правил агрессивна — блокировка интервалов короче секунды может затронуть живо обновляемый виджет, который тебе как раз нужен. Поэтому ограничь область. Создай папку под названием «Анти-тёмные-паттерны» и добавь по одному правилу на каждый магазин, которым ты пользуешься, у каждого — узкий URL-паттерн. Выключай всю папку, когда не покупаешь. Ты получаешь более спокойное оформление заказа без побочных эффектов в других местах.

Смотри также

Покупка должна быть решением, а не реакцией. Установи JustZix, вставь CSS-блок выше — и смотри, как искусственное давление исчезает с каждой страницы товара, которую ты открываешь.

Оцени эту статью

Оценок пока нет — оцени первым.

Попробуй сам

Установи JustZix и вставь любой сниппет из этой статьи. Две минуты от нуля до работающего правила на всех твоих устройствах.

Получить JustZix

Возможности · Как это работает · Примеры · Применение