elementFromPoint(x, y)
Вызов
Например, код выше выделяет с помощью стилей и выводит имя тега элемента, который сейчас в центре окна браузера.
#браузер #документ #координаты
Вызов
document.elementFromPoint(x, y)
возвращает самый глубоко вложенный элемент в окне, находящийся по координатам (x, y)
.Например, код выше выделяет с помощью стилей и выводит имя тега элемента, который сейчас в центре окна браузера.
#браузер #документ #координаты
👍3
Применение для fixed позиционирования
Чаще всего нам нужны координаты для позиционирования чего-либо.
Чтобы показать что-то около нужного элемента, мы можем вызвать
Например, функция
#браузер #документ #координаты
Чаще всего нам нужны координаты для позиционирования чего-либо.
Чтобы показать что-то около нужного элемента, мы можем вызвать
getBoundingClientRect
, чтобы получить его координаты элемента, а затем использовать CSS-свойство position
вместе с left/top
(или right/bottom
).Например, функция
createMessageUnder(elem, html)
выше показывает сообщение под элементом elem
.#браузер #документ #координаты
👍3
Введение в браузерные события
Событие – это сигнал от браузера о том, что что-то произошло. Все DOM-узлы подают такие сигналы (хотя события бывают и не только в DOM).
Вот список самых часто используемых DOM-событий, пока просто для ознакомления:
События мыши:
События на элементах управления:
Клавиатурные события:
События документа:
CSS events:
Существует множество других событий. О них в следующих постах.
#браузер #документ #события
Событие – это сигнал от браузера о том, что что-то произошло. Все DOM-узлы подают такие сигналы (хотя события бывают и не только в DOM).
Вот список самых часто используемых DOM-событий, пока просто для ознакомления:
События мыши:
click
– происходит, когда кликнули на элемент левой кнопкой мыши.contextmenu
– происходит, когда кликнули на элемент правой кнопкой мыши.mouseover
/ mouseout
– когда мышь наводится на / покидает элемент.mousedown
/ mouseup
– когда нажали / отжали кнопку мыши на элементе.mousemove
– при движении мыши.События на элементах управления:
submit
– пользователь отправил форму <form>
.focus
– пользователь фокусируется на элементе.Клавиатурные события:
keydown
и keyup
– когда пользователь нажимает / отпускает клавишу.События документа:
DOMContentLoaded
– когда HTML загружен и обработан.CSS events:
transitionend
– когда CSS-анимация завершена.Существует множество других событий. О них в следующих постах.
#браузер #документ #события
👍12🔥2
Обработчики событий
Событию можно назначить обработчик, то есть функцию, которая сработает, как только событие произошло.
Именно благодаря обработчикам JavaScript-код может реагировать на действия пользователя.
Есть несколько способов назначить событию обработчик. Мы их рассмотрим, начиная с самого простого.
#браузер #документ #события
Событию можно назначить обработчик, то есть функцию, которая сработает, как только событие произошло.
Именно благодаря обработчикам JavaScript-код может реагировать на действия пользователя.
Есть несколько способов назначить событию обработчик. Мы их рассмотрим, начиная с самого простого.
#браузер #документ #события
👍3
Использование свойства DOM-объекта
Можно назначать обработчик, используя свойство DOM-элемента
К примеру,
Если обработчик задан через атрибут, то браузер читает HTML-разметку, создаёт новую функцию из содержимого атрибута и записывает в свойство.
#браузер #документ #события
Можно назначать обработчик, используя свойство DOM-элемента
on<событие>
.К примеру,
elem.onclick
.Если обработчик задан через атрибут, то браузер читает HTML-разметку, создаёт новую функцию из содержимого атрибута и записывает в свойство.
#браузер #документ #события
👍2
Обработчик в атрибуте и свойстве
Обработчик всегда хранится в свойстве DOM-объекта, а атрибут – лишь один из способов его инициализации.
Так как у элемента DOM может быть только одно свойство с именем
P.S. Два примера кода на картинке работают одинаково.
#браузер #документ #события
Обработчик всегда хранится в свойстве DOM-объекта, а атрибут – лишь один из способов его инициализации.
Так как у элемента DOM может быть только одно свойство с именем
onclick
, то назначить более одного обработчика так нельзя.P.S. Два примера кода на картинке работают одинаково.
#браузер #документ #события
👍1
HTML-атрибуты
В HTML у тегов могут быть атрибуты. Когда браузер парсит HTML, чтобы создать DOM-объекты для тегов, он распознаёт стандартные атрибуты и создаёт DOM-свойства для них.
Таким образом, когда у элемента есть
если атрибут нестандартный.
#браузер #документ #атрибуты_свойств
В HTML у тегов могут быть атрибуты. Когда браузер парсит HTML, чтобы создать DOM-объекты для тегов, он распознаёт стандартные атрибуты и создаёт DOM-свойства для них.
Таким образом, когда у элемента есть
id
или другой стандартный атрибут, создаётся соответствующее свойство. Но этого не происходит, если атрибут нестандартный.
#браузер #документ #атрибуты_свойств
👍3
Расширенная демонстрация работы с атрибутами
Пожалуйста, обратите внимание:
1.
2. Мы можем присвоить что угодно атрибуту, но это станет строкой. Поэтому в этой строчке мы получаем значение
3. Все атрибуты, в том числе те, которые мы установили, видны в
4. Коллекция
#браузер #документ #атрибуты_свойств
Пожалуйста, обратите внимание:
1.
getAttribute('About')
– здесь первая буква заглавная, а в HTML – строчная. Но это не важно: имена атрибутов регистронезависимы.2. Мы можем присвоить что угодно атрибуту, но это станет строкой. Поэтому в этой строчке мы получаем значение
"123"
.3. Все атрибуты, в том числе те, которые мы установили, видны в
outerHTML
.4. Коллекция
attributes
является перебираемой. В ней есть все атрибуты элемента (стандартные и нестандартные) в виде объектов со свойствами name
и value
.#браузер #документ #атрибуты_свойств
👍2
Свойства className и classList
Когда-то давно в JavaScript существовало ограничение: зарезервированное слово типа "
Поэтому для классов было введено схожее свойство "
Если мы присваиваем что-то
Для этого есть другое свойство:
#браузер #документ #свойства
Когда-то давно в JavaScript существовало ограничение: зарезервированное слово типа "
class
" не могло быть свойством объекта. Это ограничение сейчас отсутствует, но в то время было невозможно иметь свойство elem.class
.Поэтому для классов было введено схожее свойство "
className": elem.className
соответствует атрибуту "class
".Если мы присваиваем что-то
elem.className
, то это заменяет всю строку с классами. Иногда это то, что нам нужно, но часто мы хотим добавить/удалить один класс.Для этого есть другое свойство:
elem.classList
- это специальный объект с методами для добавления/удаления одного класса.#браузер #документ #свойства
👍5🔥1
DOM-свойства типизированы
DOM-свойства не всегда являются строками. Например, свойство
Есть и другие примеры. Атрибут
#браузер #документ #свойства_узлов
DOM-свойства не всегда являются строками. Например, свойство
input.checked
(для чекбоксов) имеет логический тип.Есть и другие примеры. Атрибут
style
– строка, но свойство style
является объектом (как в примере на картинке).#браузер #документ #свойства_узлов
👍2
Function Declaration
В отличие от переменных, объявленных с помощью
Для верхнеуровневых функций это означает момент, когда скрипт начинает выполнение.
Вот почему мы можем вызвать функцию, объявленную через
Следующий код демонстрирует, что уже с самого начала в лексическом окружении что-то есть. Там есть
В отличие от переменных, объявленных с помощью
let
, они полностью инициализируются не тогда, когда выполнение доходит до них, а раньше, когда создаётся лексическое окружение.Для верхнеуровневых функций это означает момент, когда скрипт начинает выполнение.
Вот почему мы можем вызвать функцию, объявленную через
Function
Declaration
, до того, как она определена.Следующий код демонстрирует, что уже с самого начала в лексическом окружении что-то есть. Там есть
say
, потому что это Function Declaration
. И позже там появится phrase
, объявленное через let
#функции #function_declaration👍5
Вложенные функции
Функция называется «вложенной», когда она создаётся внутри другой функции. Это очень легко сделать в JavaScript.
Мы можем использовать это для упорядочивания нашего кода, например, как в картинке выше.
Здесь вложенная функция
Что ещё интереснее, вложенная функция может быть возвращена: либо в качестве свойства нового объекта (если внешняя функция создаёт объект с методами), либо сама по себе. И затем может быть использована в любом месте. Не важно где, она всё так же будет иметь доступ к тем же внешним переменным.
#функции #вложенные
Функция называется «вложенной», когда она создаётся внутри другой функции. Это очень легко сделать в JavaScript.
Мы можем использовать это для упорядочивания нашего кода, например, как в картинке выше.
Здесь вложенная функция
getFullName()
создана для удобства. Она может получить доступ к внешним переменным и, значит, вывести полное имя. В JavaScript вложенные функции используются очень часто.Что ещё интереснее, вложенная функция может быть возвращена: либо в качестве свойства нового объекта (если внешняя функция создаёт объект с методами), либо сама по себе. И затем может быть использована в любом месте. Не важно где, она всё так же будет иметь доступ к тем же внешним переменным.
#функции #вложенные
👍3
For, while
Для цикла у каждой итерации своё отдельное лексическое окружение. Если переменная объявлена в
Обратите внимание:
И так же, как и в
#циклы #for #while
Для цикла у каждой итерации своё отдельное лексическое окружение. Если переменная объявлена в
for(let ...)
, то она также в нёмОбратите внимание:
let
i визуально находится снаружи {...}
. Но конструкция for
– особенная в этом смысле, у каждой итерации цикла своё собственное лексическое окружение с текущим i
в нём.И так же, как и в
if
, ниже цикла i
невидима.#циклы #for #while
👍3
Блоки кода
Мы также можем использовать «простые» блоки кода
Например, в браузере все скрипты (кроме
Это может произойти, если название переменной – широко распространённое слово, а авторы скрипта не знают друг о друге.
Если мы хотим этого избежать, мы можем использовать блок кода для изоляции всего скрипта или какой-то его части(на картинке выше)
Из-за того, что у блока есть собственное лексическое окружение, код снаружи него (или в другом скрипте) не видит переменные этого блока.
#функции #блоки
Мы также можем использовать «простые» блоки кода
{...}
, чтобы изолировать переменные в «локальной области видимости».Например, в браузере все скрипты (кроме
type="module"
) разделяют одну общую глобальную область. Так что, если мы создадим глобальную переменную в одном скрипте, она станет доступна и в других. Но это становится источником конфликтов, если два скрипта используют одно и то же имя переменной и перезаписывают друг друга.Это может произойти, если название переменной – широко распространённое слово, а авторы скрипта не знают друг о друге.
Если мы хотим этого избежать, мы можем использовать блок кода для изоляции всего скрипта или какой-то его части(на картинке выше)
Из-за того, что у блока есть собственное лексическое окружение, код снаружи него (или в другом скрипте) не видит переменные этого блока.
#функции #блоки
👍5
if...else
Управляющая конструкция. В зависимости от условия выбирает, какой блок кода выполнить.
В разработке много задач, в которых нужно по-разному обрабатывать данные. Все эти примеры описываются фразой «если ..., то ...»:
- если пользователь вошёл в систему, то показать содержание почтового ящика. В противном случае — форму логина.
- если сумма покупки больше 2000₽, то посчитать скидку 10%.
- если покупка оплачена, то показать экран успеха. В противном случае — экран с ошибкой.
Фразой «если ...» определяется условие. Если условие выполняется, то мы выполняем часть, описанную фразой «то...». Если условие не выполняется, то нужно смотреть на фразу «В противном случае ...», когда она есть.
#переменные #if #else
Управляющая конструкция. В зависимости от условия выбирает, какой блок кода выполнить.
В разработке много задач, в которых нужно по-разному обрабатывать данные. Все эти примеры описываются фразой «если ..., то ...»:
- если пользователь вошёл в систему, то показать содержание почтового ящика. В противном случае — форму логина.
- если сумма покупки больше 2000₽, то посчитать скидку 10%.
- если покупка оплачена, то показать экран успеха. В противном случае — экран с ошибкой.
Фразой «если ...» определяется условие. Если условие выполняется, то мы выполняем часть, описанную фразой «то...». Если условие не выполняется, то нужно смотреть на фразу «В противном случае ...», когда она есть.
#переменные #if #else
👍4
Цикл
Цикл — это повторяющаяся последовательность действий.
Цикл состоит из условия и тела цикла.
Перед запуском цикла проверяется условие. Если условие истинное, то выполняется блок кода, который называется телом цикла. Затем этот шаг повторяется. Так будет продолжаться, пока условие не станет ложным.
Каждое выполнение тела цикла называется итерацией.
JavaScript предоставляет несколько способов создания цикла. Самые распространённые из них —
Цикл — это повторяющаяся последовательность действий.
Цикл состоит из условия и тела цикла.
Перед запуском цикла проверяется условие. Если условие истинное, то выполняется блок кода, который называется телом цикла. Затем этот шаг повторяется. Так будет продолжаться, пока условие не станет ложным.
Каждое выполнение тела цикла называется итерацией.
JavaScript предоставляет несколько способов создания цикла. Самые распространённые из них —
while
и for
(инициализация; условие; завершающая операция) {}
#циклы👍2