Обнаружение возможностей браузера

Umbrella JS предоставляет компактный инструмент для работы с DOM, событиями и AJAX. При этом библиотека не замещает специфику браузера, а дополняет её удобными утилитами. Тема обнаружения возможностей браузера особенно важна для интерфейсов, использующих современные API, и в Umbrella JS может быть реализована через сочетание собственных методов и встроенных возможностей окружения.

Расширенные DOM-операции часто зависят от наличия определённых методов. Например, classList, querySelectorAll или closest. Umbrella JS использует собственные методы-обёртки (u(...)), которые автоматически адаптируются к текущему окружению, уменьшая вероятность ошибок. Проверка доступности тех или иных методов остаётся полезным при решении редких несовместимостей.

if ('classList' in document.documentElement) {
  u('div').addClass('active');
}

Такой подход обеспечивает оптимальное поведение в старых движках рендеринга и тестируемых средах (например, jsdom).

Событийная модель и протоколы

События могут отличаться между браузерами, включая различия в именах, свойствах объекта события и наличии пассивных обработчиков. Umbrella JS предоставляет единый интерфейс on, off и trigger, скрывающий большую часть несовместимостей. Однако выявление поддержки конкретных опций остаётся за разработчиком.

Поддержка пассивных обработчиков проверяется через механизм пробных вызовов:

let passiveSupported = false;
try {
  const opts = {
    get passive() {
      passiveSupported = true;
      return false;
    }
  };
  window.addEventListener('test', () => {}, opts);
} catch (_) {}

if (passiveSupported) {
  u(window).on('scroll', handler, { passive: true });
}

Наличие этой возможности повышает производительность интерфейсов с частыми событиями прокрутки и жестов.

Особенности поддержки AJAX и Fetch

Umbrella JS включает методы ajax и get, использующие под капотом XMLHttpRequest. При работе с fetch и другими современными API можно выполнить проверку поддержки до вызова Umbrella-методов, выбирая наиболее эффективный механизм:

if ('fetch' in window) {
  fetch('/data.json').then(r => r.json()).then(data => { ... });
} else {
  u.ajax({ url: '/data.json', dataType: 'json' }).then(data => { ... });
}

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

Обнаружение CSS-возможностей

Стилевые возможности браузера напрямую влияют на работу компонентов интерфейса. Предварительная проверка поддержки CSS-директив и свойств помогает избежать визуальных расхождений. Современные движки поддерживают метод CSS.supports, который можно использовать совместно с Umbrella JS для управления состояниями классов:

if (CSS.supports('display', 'grid')) {
  u('body').addClass('supports-grid');
} else {
  u('body').addClass('no-grid');
}

Такой подход упрощает адаптивный дизайн и проверку специфики рендеринга.

Работа с сенсорными возможностями

Наличие сенсорного экрана, жестов или поддержки Pointer Events влияет на взаимодействие с компонентами Umbrella JS. Обнаружение сенсорных возможностей выполняется через проверку объектов window и navigator, после чего можно безопасно подписываться на соответствующие события через u(...).on.

const touch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;

if (touch) {
  u('.button').on('touchstart', startHandler);
} else {
  u('.button').on('mousedown', startHandler);
}

При наличии Pointer Events использование pointerdown и pointerup становится универсальным решением, исключающим необходимость ветвления для разных устройств.

Работа с API уровня платформы

Современные приложения используют Web Storage, Service Workers, WebRTC, Clipboard API и другие возможности, для которых необходимо явное обнаружение поддержки. Umbrella JS не содержит специальных абстракций над этими API, но может служить универсальным механизмом управления DOM-состоянием, загрузкой данных и реакциями на события.

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js');
  u('body').addClass('has-sw');
}

Связь между наличием функций и их визуальным представлением достигается через минимальные операции с DOM-узлами.

Практика комбинированной проверки

Проверка возможностей браузера редко ограничивается одним условием. На практике применяется комбинация тестов с введением сценариев для деградации поведения. Umbrella JS выступает в роли вспомогательного инструмента, позволяющего применять классы, изменять разметку, подключать обработчики и инициировать запросы в зависимости от результата проверок.

Ключевой принцип заключается в том, что обнаружение возможностей выполняется на стороне платформы, а Umbrella JS служит локальным адаптером для удобной реакции интерфейса. Такой подход снижает зависимость от конкретных браузеров, и делает код более предсказуемым при появлении новых технологий рендеринга и API.