Phoenix.LiveView.JS
Исходный кодПредоставляет команды для выполнения служебных операций JavaScript на стороне клиента.
Команды JS поддерживают множество служебных операций для распространённых задач на стороне клиента, таких как добавление и удаление CSS-классов, установка и удаление атрибутов тегов, отображение и скрытие содержимого, а также появление и исчезновение элементов с помощью анимации. Эти операции можно выполнять с помощью хуков на стороне клиента, но команды JS учитывают обновление DOM, поэтому операции, применённые через API JS, сохраняются для элементов после обновлений с сервера.
Помимо служебных операций, выполняемых исключительно на стороне клиента, команды JS включают богатый API push для расширения стандартных привязок phx-, отправляющих события, с помощью параметров для настройки целевых элементов, состояний загрузки и дополнительных значений полезной нагрузки.
Если вам нужно вызывать эти команды через JavaScript, см. раздел Взаимодействие с JavaScript.
Служебные команды на стороне клиента
Доступны следующие служебные команды:
-
add_class— Добавляет классы элементам, с необязательными переходами -
remove_class— Удаляет классы у элементов, с необязательными переходами -
toggle_class— Добавляет или удаляет классы у элементов, с необязательными переходами -
set_attribute— Устанавливает атрибут элементам -
remove_attribute— Удаляет атрибут у элементов -
toggle_attribute— Устанавливает или удаляет атрибут элемента в зависимости от наличия атрибута. -
ignore_attributes— Помечает атрибуты как игнорируемые, пропуская их при обновлении DOM. -
show— Показывает элементы, с необязательными переходами -
hide— Скрывает элементы, с необязательными переходами -
toggle— Показывает или скрывает элементы в зависимости от их видимости, с необязательными переходами -
transition— Применяет к элементам временный переход для анимации -
dispatch— Отправляет событие DOM элементам
Например, следующий компонент модального окна можно показывать и скрывать на стороне клиента без обращения к серверу:
alias Phoenix.LiveView.JS
def hide_modal(js \\ %JS{}) do
js
|> JS.hide(transition: "fade-out", to: "#modal")
|> JS.hide(transition: "fade-out-scale", to: "#modal-content")
end
def modal(assigns) do
~H"""
<div id="modal" class="phx-modal" phx-remove={hide_modal()}>
<div
id="modal-content"
class="phx-modal-content"
phx-click-away={hide_modal()}
phx-window-keydown={hide_modal()}
phx-key="escape"
>
<button class="phx-modal-close" phx-click={hide_modal()}>✖</button>
<p>{@text}</p>
</div>
</div>
"""
end
Расширенная отправка событий
Команда push/1 позволяет расширить встроенную обработку отправляемых событий, когда событие phx- отправляется на сервер. Например, может потребоваться указать конкретный компонент в качестве цели, задать дополнительные значения полезной нагрузки, включаемые в событие, применить состояния загрузки к внешним элементам и т. д. Рассмотрим это базовое событие phx-click:
<button phx-click="inc">+</button>
Предположим, вам нужно указать текущий компонент в качестве цели и применить состояние загрузки к родительскому контейнеру, пока клиент ожидает подтверждения от сервера:
alias Phoenix.LiveView.JS
~H"""
<button phx-click={JS.push("inc", loading: ".thermo", target: @myself)}>+</button>
"""
Команды отправки событий также можно комбинировать со всеми остальными служебными командами. Например, чтобы добавить класс при отправке события:
<button phx-click={
JS.push("inc", loading: ".thermo", target: @myself)
|> JS.add_class("warmer", to: ".thermo")
}>+</button>
Атрибуты phx-value-* также будут включены в полезную нагрузку; их значения будут перезаписаны значениями, непосредственно заданными в push/1. Также будет использоваться атрибут phx-target, и его значение будет перезаписано.
<button
phx-click={JS.push("inc", value: %{limit: 40})}
phx-value-room="bedroom"
phx-value-limit="this value will be 40"
phx-target={@myself}
>+</button>
Селекторы DOM
Все служебные команды на стороне клиента из этого модуля принимают необязательный селектор DOM с помощью параметра :to.
Это может быть строка с обычным селектором DOM, например:
JS.add_class("warmer", to: ".thermo")
JS.hide(to: "#modal")
JS.show(to: "body a:nth-child(2)")
Также можно указать области действия для селектора DOM. Доступны следующие области:
-
{:inner, "selector"}Для выбора элемента внутри элемента, с которым взаимодействуют. -
{:closest, "selector"}Для выбора ближайшего элемента, начиная с элемента, с которым взаимодействуют, и двигаясь вверх по дереву.
Например, при создании выпадающего списка для кнопки можно использовать область действия :inner:
<div phx-click={JS.show(to: {:inner, ".menu"})}>
<div>Open me</div>
<div class="menu hidden" phx-click-away={JS.hide()}>
I'm in the dropdown menu
</div>
</div>
Пользовательские события JS с помощью JS.dispatch/1 и window.addEventListener
dispatch/1 можно использовать для отправки пользовательских событий JavaScript элементам. Например, можно использовать JS.dispatch("click", to: "#foo") для отправки элементу события щелчка.
Это также позволяет дополнять элементы пользовательскими событиями с помощью window.addEventListener в JavaScript и вызывать их через dispatch/1. Например, предположим, что вы хотите добавить в приложение функцию копирования в буфер обмена. Для этого можно создать пользовательское событие:
window.addEventListener("my_app:clipcopy", (event) => {
if ("clipboard" in navigator) {
const text = event.target.textContent;
navigator.clipboard.writeText(text);
} else {
alert("Sorry, your browser does not support clipboard copy.");
}
});
Теперь можно добавить такую кнопку:
<button phx-click={JS.dispatch("my_app:clipcopy", to: "#element-with-text-to-copy")}>
Copy content
</button>
Сочетание dispatch/1 и window.addEventListener — это мощный механизм, позволяющий увеличить количество действий, которые можно запускать на стороне клиента из кода LiveView.
Также можно использовать window.addEventListener для прослушивания событий, отправленных сервером. Подробнее см. в нашем руководстве по взаимодействию с JavaScript.
Объединение команд JS
Все функции этого модуля могут принимать существующую структуру %JS{} в качестве первого аргумента, что позволяет объединять несколько команд в цепочку, например отправлять событие на сервер и оптимистично скрывать модальное окно:
<div id="modal" class="modal">
My Modal
</div>
<button phx-click={JS.push("modal-closed") |> JS.remove_class("show", to: "#modal", transition: "fade-out")}>
hide modal
</button>
Обратите внимание: сами команды выполняются на стороне клиента в порядке их объединения, и клиент не дожидается подтверждения перед выполнением следующей команды. Если объединить в цепочку JS.push(...) |> JS.hide(...), команда hide, поскольку она полностью выполняется на стороне клиента, скроет элемент сразу после отправки события, не дожидаясь ответа сервера.
Команды JS, взаимодействующие с сервером, обозначены соответствующим образом. Если объединить в цепочку несколько команд, взаимодействующих с сервером, гарантируется, что они также будут выполнены в порядке их объединения, поскольку LiveView может обрабатывать только одно событие за раз. Поэтому, если сделать, например, следующее:
JS.push("my-event") |> JS.patch("/my-path?foo=bar")
гарантируется, что сначала будет отправлено событие, и только после его обработки LiveView будет обработано обновление.
Краткое описание
Типы
- add_class(names)
Добавляет классы элементам.
- concat(js1, js2)
Объединяет две команды JS, добавляя вторую в конец первой.
- dispatch(js \\ %JS{}, event)
Отправляет событие в DOM.
- exec(attr)
Выполняет команды JS, хранящиеся в атрибуте элемента.
- exec(attr, opts)
См.
exec/1.- focus(opts \\ [])
Устанавливает фокус на элемент, выбранный селектором.
- focus(js, opts)
См.
focus/1.- focus_first(opts \\ [])
Устанавливает фокус на первый дочерний элемент, выбранный селектором и способный получить фокус.
- hide(opts \\ [])
Скрывает элементы.
- hide(js, opts)
См.
hide/1.- ignore_attributes(attrs)
Помечает атрибуты как игнорируемые, пропуская их при обновлении DOM.
- navigate(href)
Отправляет на сервер событие навигации и обновляет историю pushState браузера.
- patch(href)
Отправляет на сервер событие обновления и обновляет историю pushState браузера.
- patch(href, opts)
См.
patch/1.- pop_focus(js \\ %JS{})
Переводит фокус на последний элемент, для которого он был сохранён.
- push(event)
Отправляет событие на сервер.
- push(event, opts)
См.
push/1.- push_focus(opts \\ [])
Сохраняет фокус исходного элемента, чтобы позже его восстановить.
- remove_attribute(attr)
Удаляет атрибут у элементов.
- remove_class(names)
Удаляет классы у элементов.
- set_attribute(arg)
Устанавливает атрибут элементам.
- show(opts \\ [])
Показывает элементы.
- show(js, opts)
См.
show/1.- to_encodable(js)
Возвращает непрозрачное промежуточное представление команды JS, пригодное для кодирования в JSON.
- toggle(opts \\ [])
Переключает видимость элементов.
- toggle(js, opts)
См.
toggle/1.- toggle_attribute(arg)
Устанавливает или удаляет атрибут элемента в зависимости от наличия атрибута.
- toggle_class(names)
Добавляет или удаляет классы элемента в зависимости от их наличия.
- transition(transition)
Применяет переходы к элементам.
Функции
Типы
internal()Исходный код
@opaque internal()
t()Исходный код
@type t() :: %Phoenix.LiveView.JS{ops: internal()} Функции
add_class(names)Источник
Добавляет классы элементам.
-
names— Строка с одним или несколькими именами классов для добавления.
Параметры
-
:to— Необязательный селектор DOM, к которому нужно добавить классы. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors. -
:transition— Строка классов, применяемых перед добавлением классов, или кортеж из 3 элементов, содержащий класс перехода, класс для начала перехода и класс для завершения перехода, например:{"ease-out duration-300", "opacity-0", "opacity-100"} -
:time— Время в миллисекундах, в течение которого применяется переход из:transition. По умолчанию — 200. -
:blocking— Логический флаг, блокирующий интерфейс на время перехода. Значение по умолчанию —true.
Примеры
<div id="item">My Item</div>
<button phx-click={JS.add_class("highlight underline", to: "#item")}>
highlight!
</button> add_class(js, names)Источник
См. add_class/1.
add_class(js, names, opts)Источник
См. add_class/1.
concat(js1, js2)Источник
Объединяет две JS-команды, добавляя вторую в конец первой.
dispatch(js \\ %JS{}, event)Источник
Отправляет событие в DOM.
-
event— Строковое имя отправляемого события.
Примечание: Все отправляемые события имеют тип CustomEvent, за исключением "click". Для "click" отправляется MouseEvent, чтобы корректно имитировать щелчок в пользовательском интерфейсе.
Для отправленных CustomEvent'ов данные события будут содержать dispatcher, указывающий на узел DOM, отправивший JS-событие целевому элементу.
Параметры
-
:to— Необязательный селектор DOM, которому нужно отправить событие. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors. -
:detail— Необязательная карта данных, отправляемая вместе с событием на клиенте. Эти данные будут доступны в атрибутеevent.detailобработчикам событий. -
:bubbles— Логический флаг, определяющий, будет ли событие всплывать. По умолчанию —true. -
:blocking— Логический флаг, блокирующий интерфейс до тех пор, пока обработчик события не вызоветevent.detail.done(). Функция done добавляется LiveView и должна быть вызвана в конечном итоге, чтобы разблокировать интерфейс. Это полезно для интеграции со сторонними библиотеками анимации на JavaScript.
Примеры
window.addEventListener("click", e => console.log("clicked!", e.detail))
<button phx-click={JS.dispatch("click", to: ".nav")}>Click me!</button> dispatch(js, event, opts)Источник
См. dispatch/2.
exec(attr)Источник
Выполняет JS-команды, указанные в атрибуте элемента.
-
attr— Строковый атрибут, в котором указана JS-команда
Параметры
-
:to— Необязательный селектор DOM, из которого нужно получить атрибут. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors.
Примеры
<div id="modal" phx-remove={JS.hide()}>...</div>
<button phx-click={JS.exec("phx-remove", to: "#modal")}>close</button> exec(attr, opts)Источник
См. exec/1.
exec(js, attr, opts)Источник
См. exec/1.
focus(opts \\ [])Источник
Устанавливает фокус на селектор.
Параметры
-
:to— Необязательный селектор DOM, на который нужно установить фокус. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors.
Примеры
JS.focus(to: "main")
focus(js, opts)Источник
См. focus/1.
focus_first(opts \\ [])Источник
Устанавливает фокус на первый элемент в селекторе, поддерживающий фокус.
Параметры
-
:to— Необязательный селектор DOM, на который нужно установить фокус. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors.
Примеры
JS.focus_first(to: "#modal")
focus_first(js, opts)Источник
См. focus_first/1.
hide(opts \\ [])Источник
Скрывает элементы.
Примечание: Целевыми становятся только видимые элементы, то есть элементы с высотой и/или шириной больше нуля.
Параметры
-
:to— Необязательный селектор DOM, элементы которого нужно скрыть. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors. -
:transition— Строка классов, применяемых перед скрытием, или кортеж из 3 элементов, содержащий класс перехода, класс для начала перехода и класс для завершения перехода, например:{"ease-out duration-300", "opacity-100", "opacity-0"} -
:time— Время в миллисекундах, в течение которого применяется переход из:transition. По умолчанию — 200. -
:blocking— Логический флаг, блокирующий интерфейс на время перехода. Значение по умолчанию —true.
В процессе к скрываемым элементам будут отправлены следующие события:
- При запуске действия на клиенте отправляется
phx:hide-start. - По истечении времени, указанного в
:time, отправляетсяphx:hide-end.
Примеры
<div id="item">My Item</div>
<button phx-click={JS.hide(to: "#item")}>
hide!
</button>
<button phx-click={JS.hide(to: "#item", transition: "fade-out-scale")}>
hide fancy!
</button> hide(js, opts)Источник
См. hide/1.
ignore_attributes(attrs)Источник
Помечает атрибуты как игнорируемые, пропуская их при обновлении DOM.
Принимает одно имя атрибута или список имён атрибутов. В качестве подстановочного знака можно использовать звёздочку *.
После установки указанные атрибуты не будут обновляться при обновлениях LiveView. Это относится и к атрибутам, удаляемым сервером.
Чтобы снять отметку с атрибута, нужно повторно вызвать ignore_attributes/1, передав обновлённый список атрибутов.
Чаще всего это полезно в сочетании с привязкой phx-mounted, например:
<dialog phx-mounted={JS.ignore_attributes("open")}>
...
</dialog>
Примечание о поведении phx-mounted
Привязка phx-mounted выполняется при монтировании LiveView. Это означает, что с помощью ignore_attributes/1 нельзя сохранить атрибуты, установленные на клиенте во время автономного рендеринга. JS.ignore_attributes/1 будет игнорировать только последующие изменения со стороны сервера.
Параметры
-
:to— Необязательный селектор DOM для выбора целевого элемента. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors.
Примеры
JS.ignore_attributes(["open", "data-*"], to: "#my-dialog")
ignore_attributes(attrs, opts)Источник
ignore_attributes(js, attrs, opts)Источник
navigate(href)Источник
Отправляет событие навигации на сервер и обновляет историю pushState браузера.
Параметры
-
:replace— Заменять ли историю pushState браузера. По умолчанию —false.
Примеры
JS.navigate("/my-path") navigate(href, opts)Источник
См. navigate/1.
navigate(js, href, opts)Источник
См. navigate/1.
patch(href)Источник
Отправляет событие обновления на сервер и обновляет историю pushState браузера.
Параметры
-
:replace— Заменять ли историю pushState браузера. По умолчанию —false.
Примеры
JS.patch("/my-path") patch(href, opts)Источник
См. patch/1.
patch(js, href, opts)Источник
См. patch/1.
pop_focus(js \\ %JS{})Источник
Устанавливает фокус на последний добавленный в стек элемент.
Примеры
JS.pop_focus()
push(event)Источник
Отправляет событие на сервер.
-
event— Строковое имя отправляемого события.
Параметры
-
:target— Селектор или идентификатор компонента, которому нужно отправить событие. Это значение заменит любой атрибутphx-target, присутствующий у элемента. -
:loading— Селектор, к которому нужно применить классы загрузки phx, напримерphx-click-loading, если событие было вызвано с помощьюphx-click. Обновления с сервера будут заблокированы для элемента до подтверждения отправки сервером. -
:page_loading— Логическое значение, определяющее, нужно ли вызывать события phx:page-loading-start и phx:page-loading-stop для этой отправки. По умолчанию —false. -
:value— Карта значений для отправки на сервер. Эти значения объединяются с любыми атрибутамиphx-value-*, присутствующими у элемента, и переопределяют их. При объединении все ключи рассматриваются как строки. Для событий формы, таких какphx-changeилиphx-submit, приоритет определяется следующим образом:JS.push value > phx-value-* > input value.
Примеры
<button phx-click={JS.push("clicked")}>click me!</button>
<button phx-click={JS.push("clicked", value: %{id: @id})}>click me!</button>
<button phx-click={JS.push("clicked", page_loading: true)}>click me!</button> push(event, opts)Источник
См. push/1.
push(js, event, opts)Источник
См. push/1.
push_focus(opts \\ [])Источник
Сохраняет фокус с исходного элемента, чтобы позже его можно было восстановить.
Параметры
-
:to— Необязательный селектор DOM, для которого нужно сохранить фокус. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors.
Примеры
JS.push_focus() JS.push_focus(to: "#my-button")
push_focus(js, opts)Источник
См. push_focus/1.
remove_attribute(attr)Источник
Удаляет атрибут у элементов.
-
attr— Строковое имя удаляемого атрибута.
Параметры
-
:to— Необязательный селектор DOM, у элементов которого нужно удалить атрибуты. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors.
Примеры
<button phx-click={JS.remove_attribute("aria-expanded", to: "#dropdown")}>
hide
</button> remove_attribute(attr, opts)Источник
См. remove_attribute/1.
remove_attribute(js, attr, opts)Источник
См. remove_attribute/1.
remove_class(names)Источник
Удаляет классы у элементов.
-
names— Строка с одним или несколькими именами классов для удаления.
Параметры
-
:to— Необязательный селектор DOM, у элементов которого нужно удалить классы. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors. -
:transition— Строка классов, применяемых перед удалением классов, или кортеж из 3 элементов, содержащий класс перехода, класс для начала перехода и класс для завершения перехода, например:{"ease-out duration-300", "opacity-0", "opacity-100"} -
:time— Время в миллисекундах, в течение которого применяется переход из:transition. По умолчанию — 200. -
:blocking— Логический флаг, блокирующий интерфейс на время перехода. Значение по умолчанию —true.
Примеры
<div id="item">My Item</div>
<button phx-click={JS.remove_class("highlight underline", to: "#item")}>
remove highlight!
</button> remove_class(js, names)Источник
См. remove_class/1.
remove_class(js, names, opts)Источник
См. remove_class/1.
set_attribute(arg)Источник
Устанавливает атрибуты для элементов.
Принимает кортеж со строковыми именем и значением атрибута.
Параметры
-
:to— Необязательный селектор DOM, элементам которого нужно добавить атрибуты. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors.
Примеры
<button phx-click={JS.set_attribute({"aria-expanded", "true"}, to: "#dropdown")}>
show
</button>
Примечание о свойствах
JS.set_attribute/1 нельзя использовать для установки свойств DOM, например value поля ввода. Поэтому, если вы хотите выполнить JS.set_attribute({"value", "..."}) для поля ввода и увидеть обновлённое значение в событии формы, вместо этого используйте JS.dispatch/2:
Вместо
<.button phx-click={JS.set_attribute({"value", ""}, to: "#my_input")}>...</.button>
выполните
<script :type={Phoenix.LiveView.ColocatedJS} name="clear_input">
window.addEventListener("input:clear", (e) => {
e.target.value = ""
e.target.dispatchEvent(new Event("input", {bubbles: true}))
})
</script>
<.button phx-click={JS.dispatch("input:clear", to: "#my_input")}>...</.button>
Хотя в приведённом выше примере используется Phoenix.LiveView.ColocatedJS, вы также можете определить обработчик события непосредственно внутри app.js.
set_attribute(js, opts)Источник
См. set_attribute/1.
set_attribute(js, arg, opts)Источник
См. set_attribute/1.
show(opts \\ [])Источник
Показывает элементы.
Примечание: Целевыми становятся только скрытые элементы, то есть элементы с высотой и/или шириной, равной нулю.
Параметры
-
:to— Необязательный селектор DOM, элементы которого нужно показать. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors. -
:transition— Строка классов, применяемых перед показом, или кортеж из 3 элементов, содержащий класс перехода, класс для начала перехода и класс для завершения перехода, например:{"ease-out duration-300", "opacity-0", "opacity-100"} -
:time— Время в миллисекундах, в течение которого применяется переход из:transition. По умолчанию — 200. -
:blocking— Логический флаг, блокирующий интерфейс на время перехода. Значение по умолчанию —true. -
:display— Необязательное значение display, устанавливаемое при показе. По умолчанию —"block", кроме строк и ячеек таблицы, для которых по умолчанию используются"table-row"и"table-cell".
В процессе к показываемым элементам будут отправлены следующие события:
- При запуске действия на клиенте отправляется
phx:show-start. - По истечении времени, указанного в
:time, отправляетсяphx:show-end.
Примеры
<div id="item">My Item</div>
<button phx-click={JS.show(to: "#item")}>
show!
</button>
<button phx-click={JS.show(to: "#item", transition: "fade-in-scale")}>
show fancy!
</button> show(js, opts)Источник
См. show/1.
to_encodable(js)Источник
@spec to_encodable(js :: t()) :: internal()
Возвращает непрозрачное промежуточное представление JS-команды, которое можно закодировать в JSON.
В большинстве случаев вызывать эту функцию напрямую не потребуется, поскольку JS-команды автоматически кодируются в местах их обычного использования: в шаблонах HEEx или в составе данных Phoenix.LiveView.push_event/3.
Эта функция полезна при использовании пользовательской библиотеки JSON. JS-команды реализуют протоколы Jason.Encoder и JSON.Encoder, поэтому они автоматически кодируются при использовании любой из этих библиотек JSON.
Примеры
На сервере динамически сформируйте JS-команды и отправьте их клиенту:
socket
|> push_event("myapp:exec_js", %{
to: "#items-#{item.id}",
js: js_commands_for(item) |> JS.to_encodable()
})
Автоматическое кодирование
Обратите внимание: вызывать to_encodable/1 не нужно, если вы используете Jason или JSON — вместо этого можно передавать JS-команды напрямую:
socket
|> push_event("myapp:exec_js", %{
to: "#items-#{item.id}",
js: JS.show()
})На клиенте обработайте событие и выполните команды:
window.addEventListener("phx:myapp:exec_js", e => {
const {to, js} = e.detail;
const el = document.querySelector(to);
if (el && js) {
window.liveSocket.execJS(el, js);
}
});
Однако обычно JS-команды хранятся в атрибуте HTML (phx-* или data-*), чтобы JavaScript на стороне клиента мог обратиться к ним позже. Например, в шаблоне LiveView:
<div id={"items-#{item.id}"} data-js={JS.show()}>
Hello!
</div>
Теперь сервер может отправить событие, ссылающееся на атрибут data-js:
socket
|> push_event("myapp:exec_attr", %{
to: "#items-#{item.id}",
attr: "data-js"
})
Наконец, на клиенте можно прочитать и выполнить команды:
window.addEventListener("phx:myapp:exec_attr", e => {
const {to, attr} = e.detail;
const el = document.querySelector(to);
const js = el && attr && el.getAttribute(attr);
if (el && js) {
window.liveSocket.execJS(el, js);
}
});
Обратите внимание: в приведённом выше коде нам не пришлось явно кодировать JS-команды или передавать их в данных события, поскольку они были отрендерены в шаблоне.
toggle(opts \\ [])Источник
Переключает видимость элемента.
Параметры
-
:to— Необязательный селектор DOM, для которого нужно переключить видимость. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors. -
:in— Строка классов, применяемых при появлении, или кортеж из 3 элементов, содержащий класс перехода, класс для начала перехода и класс для завершения перехода, например:{"ease-out duration-300", "opacity-0", "opacity-100"} -
:out— Строка классов, применяемых при исчезновении, или кортеж из 3 элементов, содержащий класс перехода, класс для начала перехода и класс для завершения перехода, например:{"ease-out duration-300", "opacity-100", "opacity-0"} -
:time— Время в миллисекундах, в течение которого применяются классы перехода:inи:out. По умолчанию — 200. -
:display— Необязательное значение display, устанавливаемое при появлении. По умолчанию —"block", кроме строк и ячеек таблицы, для которых по умолчанию используются"table-row"и"table-cell". -
:blocking— Логический флаг, блокирующий интерфейс на время перехода. Значение по умолчанию —true.
После завершения переключения на клиенте для переключаемых элементов будут отправлены события phx:show-start или phx:hide-start, а также phx:show-end или phx:hide-end.
Примеры
<div id="item">My Item</div>
<button phx-click={JS.toggle(to: "#item")}>
toggle item!
</button>
<button phx-click={JS.toggle(to: "#item", in: "fade-in-scale", out: "fade-out-scale")}>
toggle fancy!
</button> toggle(js, opts)Исходный код
См. toggle/1.
toggle_attribute(arg)Исходный код
Устанавливает или удаляет атрибут элемента в зависимости от наличия атрибута.
Принимает кортеж из двух или трёх элементов:
-
{attr, val}— устанавливает атрибуту заданное значение или удаляет его -
{attr, val1, val2}— переключает атрибут междуval1иval2
Параметры
-
:to— необязательный селектор DOM, указывающий, у каких элементов устанавливать или удалять атрибуты. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors.
Примеры
<button phx-click={JS.toggle_attribute({"aria-expanded", "true", "false"}, to: "#dropdown")}>
toggle
</button>
<button phx-click={JS.toggle_attribute({"open", "true"}, to: "#dialog")}>
toggle
</button> toggle_attribute(js, opts)Исходный код
См. toggle_attribute/1.
toggle_attribute(js, arg, opts)Исходный код
См. toggle_attribute/1.
toggle_class(names)Исходный код
Добавляет или удаляет классы элемента в зависимости от их наличия.
-
names— строка с одним или несколькими именами классов для переключения.
Параметры
-
:to— необязательный селектор DOM для выбора целевых элементов. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors. -
:transition— строка с классами, которые нужно применить перед добавлением классов, или кортеж из трёх элементов, содержащий класс перехода, класс для начала перехода и класс для завершения перехода, например:{"ease-out duration-300", "opacity-0", "opacity-100"} -
:time— время в миллисекундах, в течение которого применяется переход из:transition. По умолчанию — 200. -
:blocking— логический флаг, блокирующий интерфейс во время перехода. По умолчанию —true.
Примеры
<div id="item">My Item</div>
<button phx-click={JS.toggle_class("active", to: "#item")}>
toggle active!
</button> toggle_class(js, names)Исходный код
toggle_class(js, names, opts)Исходный код
transition(transition)Исходный код
Выполняет переходы для элементов.
-
transition— строка с классами, которые нужно применить во время перехода, или кортеж из трёх элементов, содержащий класс перехода, класс для начала перехода и класс для завершения перехода, например:{"ease-out duration-300", "opacity-0", "opacity-100"}
Переходы полезны для временного добавления к элементам класса анимации, например для выделения изменившегося содержимого.
Параметры
-
:to— необязательный селектор DOM, к элементам которого нужно применить переходы. По умолчанию используется элемент, с которым взаимодействовали. Подробности см. в разделеDOM selectors. -
:time— время в миллисекундах, в течение которого применяется переход из:transition. По умолчанию — 200. -
:blocking— логический флаг, блокирующий интерфейс во время перехода. По умолчанию —true.
Примеры
<div id="item">My Item</div>
<button phx-click={JS.transition("shake", to: "#item")}>Shake!</button>
<div phx-mounted={JS.transition({"ease-out duration-300", "opacity-0", "opacity-100"}, time: 300)}>
duration-300 milliseconds matches time: 300 milliseconds
</div> transition(transition, opts)Исходный код
См. transition/1.
transition(js, transition, opts)Исходный код
См. transition/1.
© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix-live-view.hexdocs.pm/Phoenix.LiveView.JS.html