morinap

morinap

I am using LiveView to render a form and a phx_change event to send updates back to the controller. I’m also using an extra library (Select2: https://select2.org/) as a more robust select field control for a select input on the form. I have a JavaScript event listener tied to the Select2’s change event so that I can perform certain actions, and I’d like in my event listener to then be able to push the phx_change event back to the LiveView.

I’ve inspected the change event payload and noted it’s like any other event and just contains an encoded chunk of the full form data, so I can replicate that behavior in my own code if need be, but ideally I’d like a LiveView JS-interop way to do this programmatically. Something either like this.pushFormChange() or finding the form instance and making a trigger call on the event that the JS interop has bound to, but so far I’ve been unable to find anything either in the documentation, in the source code, or in some trial-and-error that works the way I want.

Is this something that’s possible or that anybody has done? Alternatively, is my approach simply wrong here?

Showing Posts 1 to 10

chrismccord

chrismccord

Creator of Phoenix

via a hook on the input tag:

To trigger a phx-change:

this.el.dispatchEvent(new Event("input", {bubbles: true}))

To trigger a phx-submit:

this.el.dispatchEvent(new Event("submit", {bubbles: true}))

32
Post #1
morinap

morinap OP

This is exactly what I had been searching for and dancing around without quite finding it. Thank you.

mcgingras

mcgingras

I’m trying to do the same but I’m running into a very pesky error where the hook dispatches the event just fine but LiveView appears to be crashing for some other reason. I am having a hard time debugging since this seems to be in the guts of LV.

Any help would be appreciated – I realize this is not much to go off of but maybe someone has experienced the same. Thank you!

Uncaught TypeError: Cannot read property 'querySelectorAll' of null
    at Object.all (phoenix_live_view.js:1716)
    at Object.showError (phoenix_live_view.js:1868)
    at eval (phoenix_live_view.js:2845)
    at Object.eval [as callback] (phoenix_live_view.js:2702)
    at eval (phoenix.js:232)
    at Array.forEach (<anonymous>)
    at e.value (phoenix.js:231)
    at Object.eval [as callback] (phoenix.js:250)
    at e.value (phoenix.js:405)
    at Object.eval [as callback] (phoenix.js:292)
soup

soup

You might need to post some code. Are you sure the element exists or the ID is correct? Cannot read property 'querySelectorAll' of null implies something is trying to call element_but_its_null.querySelectorAll.

BartOtten

BartOtten

@chrismccord Have been searching for this answer for some time too. Seeing the answer got 12 likes, I suppose I was not the only one. Maybe it’s a good idea to add it to the JavaScript interoperability — Phoenix LiveView v1.2.5? That is were I tried to find the answer.

nidu

nidu

I had to use this function one for input with phx-debounce="blur"

function fireInputChangeEvent(input) {
    input.dispatchEvent(new Event("input", { bubbles: true }));
    if (input.phxPrivate && input.phxPrivate["debounce-blur"]) {
        setTimeout(() => input.dispatchEvent(new Event("blur", { bubbles: true })));
    }
}
bultas

bultas

To be sure, basically phx-change on form element has behaviour that live_view is listening to all of these events: onchange, oninput, onblur inside given form element.

Is there some way to recognize which event triggered the phx-change (input,change or blur) ? I mean in live_view handle_event("phx-change-event")

thanks

simoncocking

simoncocking

This works well in Webkit and Chromium-based browsers, but I’m striking an issue with Firefox: Firefox insists on submitting the form over HTTP when I dispatch a submit event to the form. This is the code (using AlpineJS, I’m attempting to submit the popover form when the user clicks away):

<%= f = form_for @changeset, "#",
    id: "my_form",
    phx_submit: "submit",
    phx_target: @phx_target,
    phx_trigger_action: false,
    "x-data": "{show_form: true}",
    "x-show": "show_form",
    # Submit the form when we click off, and hide the popover
    "x-on:mousedown.outside": "show_form = false; $el.dispatchEvent(new Event('submit', {bubbles: true}))" %>

Anyone know how to prevent Firefox from actually submitting over HTTP?

mhmtarif

mhmtarif

$el.dispatchEvent(new Event(‘submit’, {bubbles: true , cancelable: true}))

mphuie

mphuie

How would I trigger a form phx_submit from a global hotkey?

IE ctrl + s anywhere on the page would trigger it via window.onkeydown.

Also reading the javascript interop docs, it looks like you add client side JS in app.js, which is loaded for every page? Why can’t you inline the JS into your specific view?

— All posts loaded —

Where Next? Top

Trending in Questions Top

water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New

Other Trending Topics Top

budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews