Spec-Zone.ru › Phoenix

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 будет обработано обновление.

Краткое описание

Типы

internal()
t()

Функции

add_class(names)

Добавляет классы элементам.

add_class(js, names)

См. add_class/1.

add_class(js, names, opts)

См. add_class/1.

concat(js1, js2)

Объединяет две команды JS, добавляя вторую в конец первой.

dispatch(js \\ %JS{}, event)

Отправляет событие в DOM.

dispatch(js, event, opts)

См. dispatch/2.

exec(attr)

Выполняет команды JS, хранящиеся в атрибуте элемента.

exec(attr, opts)

См. exec/1.

exec(js, attr, opts)

См. exec/1.

focus(opts \\ [])

Устанавливает фокус на элемент, выбранный селектором.

focus(js, opts)

См. focus/1.

focus_first(opts \\ [])

Устанавливает фокус на первый дочерний элемент, выбранный селектором и способный получить фокус.

focus_first(js, opts)

См. focus_first/1.

hide(opts \\ [])

Скрывает элементы.

hide(js, opts)

См. hide/1.

ignore_attributes(attrs)

Помечает атрибуты как игнорируемые, пропуская их при обновлении DOM.

ignore_attributes(attrs, opts)
ignore_attributes(js, attrs, opts)
navigate(href)

Отправляет на сервер событие навигации и обновляет историю pushState браузера.

navigate(href, opts)

См. navigate/1.

navigate(js, href, opts)

См. navigate/1.

patch(href)

Отправляет на сервер событие обновления и обновляет историю pushState браузера.

patch(href, opts)

См. patch/1.

patch(js, href, opts)

См. patch/1.

pop_focus(js \\ %JS{})

Переводит фокус на последний элемент, для которого он был сохранён.

push(event)

Отправляет событие на сервер.

push(event, opts)

См. push/1.

push(js, event, opts)

См. push/1.

push_focus(opts \\ [])

Сохраняет фокус исходного элемента, чтобы позже его восстановить.

push_focus(js, opts)

См. push_focus/1.

remove_attribute(attr)

Удаляет атрибут у элементов.

remove_attribute(attr, opts)

См. remove_attribute/1.

remove_attribute(js, attr, opts)

См. remove_attribute/1.

remove_class(names)

Удаляет классы у элементов.

remove_class(js, names)

См. remove_class/1.

remove_class(js, names, opts)

См. remove_class/1.

set_attribute(arg)

Устанавливает атрибут элементам.

set_attribute(js, opts)

См. set_attribute/1.

set_attribute(js, arg, opts)

См. set_attribute/1.

show(opts \\ [])

Показывает элементы.

show(js, opts)

См. show/1.

to_encodable(js)

Возвращает непрозрачное промежуточное представление команды JS, пригодное для кодирования в JSON.

toggle(opts \\ [])

Переключает видимость элементов.

toggle(js, opts)

См. toggle/1.

toggle_attribute(arg)

Устанавливает или удаляет атрибут элемента в зависимости от наличия атрибута.

toggle_attribute(js, opts)

См. toggle_attribute/1.

toggle_attribute(js, arg, opts)

См. toggle_attribute/1.

toggle_class(names)

Добавляет или удаляет классы элемента в зависимости от их наличия.

toggle_class(js, names)
toggle_class(js, names, opts)
transition(transition)

Применяет переходы к элементам.

transition(transition, opts)

См. transition/1.

transition(js, transition, opts)

См. transition/1.

Типы

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.

Пакет Hex Предпросмотр Hex Просмотреть llms.txt Скачать версию ePub

Создано с помощью ExDoc (v0.40.3) для языка программирования Elixir

© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix-live-view.hexdocs.pm/Phoenix.LiveView.JS.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API