Skip to content

Commit 7af2d0d

Browse files
authored
Optimize serializeForm (#3696)
* Optimize serializeForm The current code did lots of unnecessary work that quickly exploded in complexity for large forms. See: https://elixirforum.com/t/running-into-javascript-timeouts-with-liveview-browser-tab-hangs-and-medium-sized-forms/69664 * lint * use key instead of input.name
1 parent 589f2a8 commit 7af2d0d

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

assets/js/phoenix_live_view/view.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,26 @@ let serializeForm = (form, metadata, onlyNames = []) => {
100100

101101
const params = new URLSearchParams()
102102

103-
let elements = Array.from(form.elements)
103+
const {inputsUnused, onlyHiddenInputs} = Array.from(form.elements).reduce((acc, input) => {
104+
const {inputsUnused, onlyHiddenInputs} = acc
105+
const key = input.name
106+
if(!key){ return acc }
107+
108+
if(inputsUnused[key] === undefined){ inputsUnused[key] = true }
109+
if(onlyHiddenInputs[key] === undefined){ onlyHiddenInputs[key] = true }
110+
111+
const isUsed = DOM.private(input, PHX_HAS_FOCUSED) || DOM.private(input, PHX_HAS_SUBMITTED)
112+
const isHidden = input.type === "hidden"
113+
inputsUnused[key] = inputsUnused[key] && !isUsed
114+
onlyHiddenInputs[key] = onlyHiddenInputs[key] && isHidden
115+
116+
return acc
117+
}, {inputsUnused: {}, onlyHiddenInputs: {}})
118+
104119
for(let [key, val] of formData.entries()){
105120
if(onlyNames.length === 0 || onlyNames.indexOf(key) >= 0){
106-
let inputs = elements.filter(input => input.name === key)
107-
let isUnused = !inputs.some(input => (DOM.private(input, PHX_HAS_FOCUSED) || DOM.private(input, PHX_HAS_SUBMITTED)))
108-
let hidden = inputs.every(input => input.type === "hidden")
121+
let isUnused = inputsUnused[key]
122+
let hidden = onlyHiddenInputs[key]
109123
if(isUnused && !(submitter && submitter.name == key) && !hidden){
110124
params.append(prependFormDataKey(key, "_unused_"), "")
111125
}

0 commit comments

Comments
 (0)