Строки, Intl.Collator
Intl.Collator - конструктор для «сортировщиков», которые представляют собой объекты, позволяющие сравнивать строки с учетом языка.
Общая проблема строк JavaScript – они «не в курсе» языка и особенностей стран, где находится посетитель.
При сравнении сравниваются коды символов, а это неправильно, к примеру, в русском языке оказывается, что
Intl.Collator решает все эти проблемы.
P.S. Результат
#разное #Intl #интернационализация
Intl.Collator - конструктор для «сортировщиков», которые представляют собой объекты, позволяющие сравнивать строки с учетом языка.
Общая проблема строк JavaScript – они «не в курсе» языка и особенностей стран, где находится посетитель.
При сравнении сравниваются коды символов, а это неправильно, к примеру, в русском языке оказывается, что
"ё" > "я" и "а" > "Я", хотя всем известно, что я – последняя буква алфавита и это она должна быть больше любой другой.Intl.Collator решает все эти проблемы.
P.S. Результат
compare имеет значение 1 (больше), 0 (равно) или -1 (меньше).#разное #Intl #интернационализация
👍18🔥5❤1
Даты, Intl.DateTimeFormat
Первый аргумент – такой же, как и в Collator, а в объекте
Все локали обязаны поддерживать следующие наборы настроек:
- weekday, year, month, day, hour, minute, second
- weekday, year, month, day
- year, month, day
- year, month
- month, day
- hour, minute, second
Если указанный формат не поддерживается, то настройка
#разное #Intl #интернационализация
Первый аргумент – такой же, как и в Collator, а в объекте
options мы можем определить, какие именно части даты показывать (часы, месяц, год…) и в каком формате.Все локали обязаны поддерживать следующие наборы настроек:
- weekday, year, month, day, hour, minute, second
- weekday, year, month, day
- year, month, day
- year, month
- month, day
- hour, minute, second
Если указанный формат не поддерживается, то настройка
formatMatcher задаёт алгоритм подбора наиболее близкого формата: basic – по стандартным правилам и best fit – по умолчанию, на усмотрение окружения (браузера).#разное #Intl #интернационализация
🔥9👍5
Числа, Intl.NumberFormat
Форматтер
P.S. На скрине показаны примеры создания и использования числового форматтера.
#разное #Intl #интернационализация
Форматтер
Intl.NumberFormat умеет красиво форматировать не только числа, но и валюту, а также проценты.P.S. На скрине показаны примеры создания и использования числового форматтера.
#разное #Intl #интернационализация
👍14🔥4❤2
Методы в Date, String, Number
Методы форматирования также поддерживаются в обычных строках, датах, числах:
Сравнивает строку с другой, с учётом локали.
Форматирует дату в соответствии с локалью.
То же, что и выше, но опции по умолчанию включают в себя год, месяц, день.
То же, что и выше, но опции по умолчанию включают в себя часы, минуты, секунды.
Форматирует число, используя опции
Все эти методы при запуске создают соответствующий объект
P.S. Примеры по каждому методу показаны на картинке.
#разное #Intl #интернационализация
Методы форматирования также поддерживаются в обычных строках, датах, числах:
String.prototype.localeCompare(that [, locales [, options]])Сравнивает строку с другой, с учётом локали.
Date.prototype.toLocaleString([locales [, options]])Форматирует дату в соответствии с локалью.
Date.prototype.toLocaleDateString([locales [, options]])То же, что и выше, но опции по умолчанию включают в себя год, месяц, день.
Date.prototype.toLocaleTimeString([locales [, options]])То же, что и выше, но опции по умолчанию включают в себя часы, минуты, секунды.
Number.prototype.toLocaleString([locales [, options]])Форматирует число, используя опции
Intl.NumberFormat.Все эти методы при запуске создают соответствующий объект
Intl.* и передают ему опции, можно рассматривать их как укороченные варианты вызова.P.S. Примеры по каждому методу показаны на картинке.
#разное #Intl #интернационализация
👍9🔥4
Браузерное окружение, спецификации
Язык JavaScript изначально был создан для веб-браузеров. Но с тех пор он значительно эволюционировал и превратился в кроссплатформенный язык программирования для решения широкого круга задач.
Сегодня JavaScript может использоваться в браузере, на веб-сервере или в какой-то другой среде, даже в кофеварке. Каждая среда предоставляет свою функциональность, которую спецификация JavaScript называет окружением.
Окружение предоставляет свои объекты и дополнительные функции, в дополнение базовым языковым. Браузеры, например, дают средства для управления веб-страницами. Node.js делает доступными какие-то серверные возможности и так далее.
P.S. На картинке в общих чертах показано, что доступно для JavaScript в браузерном окружении.
#браузер #документ
Язык JavaScript изначально был создан для веб-браузеров. Но с тех пор он значительно эволюционировал и превратился в кроссплатформенный язык программирования для решения широкого круга задач.
Сегодня JavaScript может использоваться в браузере, на веб-сервере или в какой-то другой среде, даже в кофеварке. Каждая среда предоставляет свою функциональность, которую спецификация JavaScript называет окружением.
Окружение предоставляет свои объекты и дополнительные функции, в дополнение базовым языковым. Браузеры, например, дают средства для управления веб-страницами. Node.js делает доступными какие-то серверные возможности и так далее.
P.S. На картинке в общих чертах показано, что доступно для JavaScript в браузерном окружении.
#браузер #документ
👍16🔥5❤1
DOM (Document Object Model)
Document Object Model, сокращённо DOM – объектная модель документа, которая представляет все содержимое страницы в виде объектов, которые можно менять.
Объект
Мы использовали в примере только
DOM Living Standard на https://dom.spec.whatwg.org
#браузер #документ
Document Object Model, сокращённо DOM – объектная модель документа, которая представляет все содержимое страницы в виде объектов, которые можно менять.
Объект
document – основная «входная точка». С его помощью мы можем что-то создавать или менять на странице.Мы использовали в примере только
document.body.style, но на самом деле возможности по управлению страницей намного шире. Различные свойства и методы описаны в спецификации:DOM Living Standard на https://dom.spec.whatwg.org
#браузер #документ
👍7🔥2❤1
BOM (Browser Object Model)
Объектная модель браузера (Browser Object Model, BOM) – это дополнительные объекты, предоставляемые браузером (окружением), чтобы работать со всем, кроме документа.
Например:
- Объект navigator даёт информацию о самом браузере и операционной системе. Среди множества его свойств самыми известными являются:
- Объект location позволяет получить текущий URL и перенаправить браузер по новому адресу.
Пример как мы можем использовать объект
Функции
#браузер #документ
Объектная модель браузера (Browser Object Model, BOM) – это дополнительные объекты, предоставляемые браузером (окружением), чтобы работать со всем, кроме документа.
Например:
- Объект navigator даёт информацию о самом браузере и операционной системе. Среди множества его свойств самыми известными являются:
navigator.userAgent – информация о текущем браузере, и navigator.platform – информация о платформе (может помочь в понимании того, в какой ОС открыт браузер – Windows/Linux/Mac и так далее).- Объект location позволяет получить текущий URL и перенаправить браузер по новому адресу.
Пример как мы можем использовать объект
location показан на рисунке.Функции
alert/confirm/prompt тоже являются частью BOM: они не относятся непосредственно к странице, но представляют собой методы объекта окна браузера для коммуникации с пользователем.#браузер #документ
👍11🔥4❤1
Пример DOM
DOM – это представление HTML-документа в виде дерева тегов.
На картинке слева отображён пример простого HTML-документа, а справа DOM дерево тегов.
Каждый узел этого дерева – это объект.
Теги являются узлами-элементами (или просто элементами). Они образуют структуру дерева:
Текст внутри элементов образует текстовые узлы, обозначенные как
Например, в теге
Обратите внимание на специальные символы в текстовых узлах:
- перевод строки:
- пробел:
#браузер #документ #dom
DOM – это представление HTML-документа в виде дерева тегов.
На картинке слева отображён пример простого HTML-документа, а справа DOM дерево тегов.
Каждый узел этого дерева – это объект.
Теги являются узлами-элементами (или просто элементами). Они образуют структуру дерева:
<html> – это корневой узел, <head> и <body> его дочерние узлы и т.д.Текст внутри элементов образует текстовые узлы, обозначенные как
#text. Текстовый узел содержит в себе только строку текста. У него не может быть потомков, т.е. он находится всегда на самом нижнем уровне.Например, в теге
<title> есть текстовый узел "О лосях".Обратите внимание на специальные символы в текстовых узлах:
- перевод строки:
↵ (в JavaScript он обозначается как \n)- пробел:
␣#браузер #документ #dom
🔥12👍6❤2
Автоисправление
Если браузер сталкивается с некорректно написанным HTML-кодом, он автоматически корректирует его при построении DOM.
Например, в начале документа всегда должен быть тег
Например, если HTML-файл состоит из единственного слова
При генерации DOM браузер самостоятельно обрабатывает ошибки в документе, закрывает теги и так далее.
В примере единственный тег
#браузер #документ #dom
Если браузер сталкивается с некорректно написанным HTML-кодом, он автоматически корректирует его при построении DOM.
Например, в начале документа всегда должен быть тег
<html>. Даже если его нет в документе – он будет в дереве DOM, браузер его создаст. То же самое касается и тега <body>.Например, если HTML-файл состоит из единственного слова
"Привет", браузер обернёт его в теги <html> и <body>, добавит необходимый тег <head>.При генерации DOM браузер самостоятельно обрабатывает ошибки в документе, закрывает теги и так далее.
В примере единственный тег
<p> не закрыт, однако DOM будет нормальным, потому что браузер сам закроет тег и восстановит отсутствующие детали.#браузер #документ #dom
👍14🔥6
Другие типы узлов
Есть и некоторые другие типы узлов, кроме элементов и текстовых узлов.
Например, узел-комментарий, который вы можете увидеть на картинке выше.
Здесь мы видим узел нового типа – комментарий, обозначенный как
Казалось бы – зачем комментарий в DOM? Он никак не влияет на визуальное отображение. Но есть важное правило: если что-то есть в HTML, то оно должно быть в DOM-дереве.
Все, что есть в HTML, даже комментарии, является частью DOM.
Даже директива
Даже объект
Существует 12 типов узлов. Но на практике мы в основном работаем с 4 из них:
#браузер #документ #dom
Есть и некоторые другие типы узлов, кроме элементов и текстовых узлов.
Например, узел-комментарий, который вы можете увидеть на картинке выше.
Здесь мы видим узел нового типа – комментарий, обозначенный как
#comment, между двумя текстовыми узлами.Казалось бы – зачем комментарий в DOM? Он никак не влияет на визуальное отображение. Но есть важное правило: если что-то есть в HTML, то оно должно быть в DOM-дереве.
Все, что есть в HTML, даже комментарии, является частью DOM.
Даже директива
<!DOCTYPE...>, которую мы ставим в начале HTML, тоже является DOM-узлом. Она находится в дереве DOM прямо перед <html>. Мы не будем рассматривать этот узел, мы даже не рисуем его на наших диаграммах, но он существует.Даже объект
document, представляющий весь документ, формально является DOM-узлом.Существует 12 типов узлов. Но на практике мы в основном работаем с 4 из них:
document, узлы-элементы, текстовые узлы, комментарии.#браузер #документ #dom
👍12🔥3
Поэкспериментируйте сами
Чтобы посмотреть структуру DOM в реальном времени, попробуйте Live DOM Viewer. Просто введите что-нибудь в поле, и ниже вы увидите, как меняется DOM.
Другой способ исследовать DOM – это использовать инструменты разработчика браузера. Это то, что мы каждый день делаем при разработке.
Для этого откройте страницу elks.html, включите инструменты разработчика и перейдите на вкладку Elements.
Выглядит примерно так, как на картинке выше.
Вы можете увидеть DOM, понажимать на элементы, детально рассмотреть их и так далее.
Обратите внимание, что структура DOM в инструментах разработчика отображается в упрощённом виде. Текстовые узлы показаны как простой текст. И кроме пробелов нет никаких «пустых» текстовых узлов. Ну и отлично, потому что большую часть времени нас будут интересовать узлы-элементы.
#браузер #документ #dom
Чтобы посмотреть структуру DOM в реальном времени, попробуйте Live DOM Viewer. Просто введите что-нибудь в поле, и ниже вы увидите, как меняется DOM.
Другой способ исследовать DOM – это использовать инструменты разработчика браузера. Это то, что мы каждый день делаем при разработке.
Для этого откройте страницу elks.html, включите инструменты разработчика и перейдите на вкладку Elements.
Выглядит примерно так, как на картинке выше.
Вы можете увидеть DOM, понажимать на элементы, детально рассмотреть их и так далее.
Обратите внимание, что структура DOM в инструментах разработчика отображается в упрощённом виде. Текстовые узлы показаны как простой текст. И кроме пробелов нет никаких «пустых» текстовых узлов. Ну и отлично, потому что большую часть времени нас будут интересовать узлы-элементы.
#браузер #документ #dom
👍6🔥2❤1
Взаимодействие с консолью
При работе с DOM нам часто требуется применить к нему JavaScript. Например: получить узел и запустить какой-нибудь код для его изменения, чтобы посмотреть результат. Вот несколько подсказок, как перемещаться между вкладками Elements и Console.
Для начала:
1. На вкладке Elements выберите первый элемент
2. Нажмите Esc – прямо под вкладкой Elements откроется Console.
Последний элемент, выбранный во вкладке Elements, доступен в консоли как
Теперь мы можем запускать на них команды. Например
#браузер #документ #dom
При работе с DOM нам часто требуется применить к нему JavaScript. Например: получить узел и запустить какой-нибудь код для его изменения, чтобы посмотреть результат. Вот несколько подсказок, как перемещаться между вкладками Elements и Console.
Для начала:
1. На вкладке Elements выберите первый элемент
<li>.2. Нажмите Esc – прямо под вкладкой Elements откроется Console.
Последний элемент, выбранный во вкладке Elements, доступен в консоли как
$0; предыдущий, выбранный до него, как $1 и т.д.Теперь мы можем запускать на них команды. Например
$0.style.background = 'red' сделает выбранный элемент красным, как на картинке выше.#браузер #документ #dom
👍16🔥4
Навигация по DOM-элементам
DOM позволяет нам делать что угодно с элементами и их содержимым, но для начала нужно получить соответствующий DOM-объект.
Все операции с DOM начинаются с объекта
Так выглядят основные ссылки, по которым можно переходить между узлами DOM (см. картинку выше).
#браузер #документ #dom_навигация
DOM позволяет нам делать что угодно с элементами и их содержимым, но для начала нужно получить соответствующий DOM-объект.
Все операции с DOM начинаются с объекта
document. Это главная «точка входа» в DOM. Из него мы можем получить доступ к любому узлу.Так выглядят основные ссылки, по которым можно переходить между узлами DOM (см. картинку выше).
#браузер #документ #dom_навигация
👍7🔥2
Сверху: documentElement и body
Самые верхние элементы дерева доступны как свойства объекта
Самый верхний узел документа:
Другой часто используемый DOM-узел – узел тега
Тег
Есть одна тонкость:
Нельзя получить доступ к элементу, которого ещё не существует в момент выполнения скрипта.
В частности, если скрипт находится в
Поэтому, в примере выше первый
#браузер #документ #dom_навигация
Самые верхние элементы дерева доступны как свойства объекта
document:<html> = document.documentElementСамый верхний узел документа:
document.documentElement. В DOM он соответствует тегу <html>.<body> = document.bodyДругой часто используемый DOM-узел – узел тега
<body>: document.body.<head> = document.headТег
<head> доступен как document.head.Есть одна тонкость:
document.body может быть равен nullНельзя получить доступ к элементу, которого ещё не существует в момент выполнения скрипта.
В частности, если скрипт находится в
<head>, document.body в нём недоступен, потому что браузер его ещё не прочитал.Поэтому, в примере выше первый
alert выведет null.#браузер #документ #dom_навигация
👍12🔥3❤1
Дочерние узлы и потомки
Здесь и далее мы будем использовать два принципиально разных термина:
- Дочерние узлы (или дети) – элементы, которые являются непосредственными детьми узла. Другими словами, элементы, которые лежат непосредственно внутри данного. Например,
- Потомки – все элементы, которые лежат внутри данного, включая детей, их детей и т.д.
В примере выше детьми тега
А потомки
#браузер #документ #dom_навигация
Здесь и далее мы будем использовать два принципиально разных термина:
- Дочерние узлы (или дети) – элементы, которые являются непосредственными детьми узла. Другими словами, элементы, которые лежат непосредственно внутри данного. Например,
<head> и <body> являются детьми элемента <html>.- Потомки – все элементы, которые лежат внутри данного, включая детей, их детей и т.д.
В примере выше детьми тега
<body> являются теги <div> и <ul> (и несколько пустых текстовых узлов).А потомки
<body>– это и прямые дети <div>, <ul> и вложенные в них: <li> (потомок <ul>) и <b> (потомок <li>) – в общем, все элементы поддерева.#браузер #документ #dom_навигация
👍9🔥6❤1
childNodes, firstChild, lastChild
Пример выше последовательно выведет детей
Обратим внимание на маленькую деталь. Если запустить пример выше, то последним будет выведен элемент
Свойства
Они, по сути, являются всего лишь сокращениями. Если у тега есть дочерние узлы, условие ниже всегда верно:
Для проверки наличия дочерних узлов существует также специальная функция
#браузер #документ #dom_навигация
childNodes содержит список всех детей, включая текстовые узлы.Пример выше последовательно выведет детей
document.body.Обратим внимание на маленькую деталь. Если запустить пример выше, то последним будет выведен элемент
<script>. На самом деле, в документе есть ещё «какой-то HTML-код», но на момент выполнения скрипта браузер ещё до него не дошёл, поэтому скрипт не видит его.Свойства
firstChild и lastChild обеспечивают быстрый доступ к первому и последнему дочернему элементу.Они, по сути, являются всего лишь сокращениями. Если у тега есть дочерние узлы, условие ниже всегда верно:
elem.childNodes[0] === elem.firstChildelem.childNodes[elem.childNodes.length - 1] === elem.lastChildДля проверки наличия дочерних узлов существует также специальная функция
elem.hasChildNodes().#браузер #документ #dom_навигация
👍9🔥5❤2
DOM-коллекции
Как мы уже видели,
И есть два важных следствия из этого:
1. Для перебора коллекции мы можем использовать
Это работает, потому что коллекция является перебираемым объектом (есть требуемый для этого метод
2. Методы массивов не будут работать, потому что коллекция – это не массив (2 пример).
Первый пункт – это хорошо для нас. Второй – бывает неудобен, но можно пережить. Если нам хочется использовать именно методы массива, то мы можем создать настоящий массив из коллекции, используя
#браузер #документ #dom_навигация
Как мы уже видели,
childNodes похож на массив. На самом деле это не массив, а коллекция – особый перебираемый объект-псевдомассив.И есть два важных следствия из этого:
1. Для перебора коллекции мы можем использовать
for..of (1 пример).Это работает, потому что коллекция является перебираемым объектом (есть требуемый для этого метод
Symbol.iterator).2. Методы массивов не будут работать, потому что коллекция – это не массив (2 пример).
Первый пункт – это хорошо для нас. Второй – бывает неудобен, но можно пережить. Если нам хочется использовать именно методы массива, то мы можем создать настоящий массив из коллекции, используя
Array.from (3 пример).#браузер #документ #dom_навигация
👍11❤4🔥4
Соседи и родитель
Соседи – это узлы, у которых один и тот же родитель.
Следующий сосед – в свойстве
Родитель доступен через
P.S. Примеры показаны на картинке выше.
#браузер #документ #dom_навигация
Соседи – это узлы, у которых один и тот же родитель.
Следующий сосед – в свойстве
nextSibling, а предыдущий – в previousSibling.Родитель доступен через
parentNode.P.S. Примеры показаны на картинке выше.
#браузер #документ #dom_навигация
👍12🔥3❤1
Навигация только по элементам
Навигационные свойства, описанные выше, относятся ко всем узлам в документе. В частности, в
Но для большинства задач текстовые узлы и узлы-комментарии нам не нужны. Мы хотим манипулировать узлами-элементами, которые представляют собой теги и формируют структуру страницы.
Поэтому давайте рассмотрим дополнительный набор ссылок, которые учитывают только узлы-элементы.
Эти ссылки похожи на те, что раньше, только в ряде мест стоит слово
-
-
-
-
#браузер #документ #dom_навигация
Навигационные свойства, описанные выше, относятся ко всем узлам в документе. В частности, в
childNodes находятся и текстовые узлы и узлы-элементы и узлы-комментарии, если они есть.Но для большинства задач текстовые узлы и узлы-комментарии нам не нужны. Мы хотим манипулировать узлами-элементами, которые представляют собой теги и формируют структуру страницы.
Поэтому давайте рассмотрим дополнительный набор ссылок, которые учитывают только узлы-элементы.
Эти ссылки похожи на те, что раньше, только в ряде мест стоит слово
Element:-
children – коллекция детей, которые являются элементами.-
firstElementChild, lastElementChild – первый и последний дочерний элемент.-
previousElementSibling, nextElementSibling – соседи-элементы.-
parentElement – родитель-элемент.#браузер #документ #dom_навигация
👍9🔥4❤1
Ещё немного ссылок: таблицы
До сих пор мы описывали основные навигационные ссылки.
Некоторые типы DOM-элементов предоставляют для удобства дополнительные свойства, специфичные для их типа.
Таблицы – отличный пример таких элементов.
Элемент
-
-
-
-
-
-
-
-
P.S. Пример выше на картинке.
#браузер #документ #dom_навигация
До сих пор мы описывали основные навигационные ссылки.
Некоторые типы DOM-элементов предоставляют для удобства дополнительные свойства, специфичные для их типа.
Таблицы – отличный пример таких элементов.
Элемент
<table>, в дополнение к свойствам, о которых речь шла выше, поддерживает следующие:-
table.rows – коллекция строк <tr> таблицы.-
table.caption/tHead/tFoot – ссылки на элементы таблицы <caption>, <thead>, <tfoot>.-
table.tBodies – коллекция элементов таблицы <tbody> (по спецификации их может быть больше одного).<thead>, <tfoot>, <tbody> предоставляют свойство rows:-
tbody.rows – коллекция строк <tr> секции.<tr>:-
tr.cells – коллекция <td> и <th> ячеек, находящихся внутри строки <tr>.-
tr.sectionRowIndex – номер строки <tr> в текущей секции <thead>/<tbody>/<tfoot>.-
tr.rowIndex – номер строки <tr> в таблице (включая все строки таблицы).<td> and <th>:-
td.cellIndex – номер ячейки в строке <tr>.P.S. Пример выше на картинке.
#браузер #документ #dom_навигация
👍14🔥3❤1
Итого по DOM навигации
Получив DOM-узел, мы можем перейти к его ближайшим соседям используя навигационные ссылки.
Есть два основных набора ссылок:
- Для всех узлов:
- Только для узлов-элементов:
Некоторые виды DOM-элементов, например таблицы, предоставляют дополнительные ссылки и коллекции для доступа к своему содержимому.
#браузер #документ #dom_навигация
Получив DOM-узел, мы можем перейти к его ближайшим соседям используя навигационные ссылки.
Есть два основных набора ссылок:
- Для всех узлов:
parentNode, childNodes, firstChild, lastChild, previousSibling, nextSibling.- Только для узлов-элементов:
parentElement, children, firstElementChild, lastElementChild, previousElementSibling, nextElementSibling.Некоторые виды DOM-элементов, например таблицы, предоставляют дополнительные ссылки и коллекции для доступа к своему содержимому.
#браузер #документ #dom_навигация
👍9🔥2❤1