diff --git a/.changeset/many-nails-press.md b/.changeset/many-nails-press.md new file mode 100644 index 0000000000..5cf60ff913 --- /dev/null +++ b/.changeset/many-nails-press.md @@ -0,0 +1,6 @@ +--- +"@lynx-js/web-constants": patch +"@lynx-js/web-elements": patch +--- + +fix: in lynx-view all-on-ui mode, the input event of input and textarea is triggered twice, and the first e.detail is a string, which does not conform to the expected data format. diff --git a/packages/web-platform/web-constants/src/eventName.ts b/packages/web-platform/web-constants/src/eventName.ts index af29b2036d..55b9fefe1c 100644 --- a/packages/web-platform/web-constants/src/eventName.ts +++ b/packages/web-platform/web-constants/src/eventName.ts @@ -8,6 +8,7 @@ export const W3cEventNameToLynx: Record = { overlaytouch: 'touch', lynxfocus: 'focus', lynxblur: 'blur', + lynxinput: 'input', }; export const LynxEventNameToW3cByTagName: Record< string, @@ -16,10 +17,12 @@ export const LynxEventNameToW3cByTagName: Record< 'X-INPUT': { 'blur': 'lynxblur', 'focus': 'lynxfocus', + 'input': 'lynxinput', }, 'X-TEXTAREA': { 'blur': 'lynxblur', 'focus': 'lynxfocus', + 'input': 'lynxinput', }, }; diff --git a/packages/web-platform/web-elements/src/XInput/XInputEvents.ts b/packages/web-platform/web-elements/src/XInput/XInputEvents.ts index 04a677435b..2c6d6c41fc 100644 --- a/packages/web-platform/web-elements/src/XInput/XInputEvents.ts +++ b/packages/web-platform/web-elements/src/XInput/XInputEvents.ts @@ -30,7 +30,7 @@ export class XInputEvents ); @registerAttributeHandler('input-filter', true) - @registerEventEnableStatusChangeHandler('input') + @registerEventEnableStatusChangeHandler('lynxinput') #handleEnableInputEvent(status: boolean | string | null) { const input = this.#getInputElement(); if (status) { @@ -83,7 +83,7 @@ export class XInputEvents input.value = filterValue; if (isComposing && !this.#sendComposingInput) return; this.#dom.dispatchEvent( - new CustomEvent('input', { + new CustomEvent('lynxinput', { ...commonComponentEventSetting, detail: { value: filterValue, @@ -109,7 +109,7 @@ export class XInputEvents // if #sendComposingInput set true, #teleportInput will send detail if (!this.#sendComposingInput) { this.#dom.dispatchEvent( - new CustomEvent('input', { + new CustomEvent('lynxinput', { ...commonComponentEventSetting, detail: { value: filterValue, diff --git a/packages/web-platform/web-elements/src/XTextarea/XTextareaEvents.ts b/packages/web-platform/web-elements/src/XTextarea/XTextareaEvents.ts index b7ebbe80f1..9f34b9823d 100644 --- a/packages/web-platform/web-elements/src/XTextarea/XTextareaEvents.ts +++ b/packages/web-platform/web-elements/src/XTextarea/XTextareaEvents.ts @@ -30,7 +30,7 @@ export class XTextareaEvents ); @registerAttributeHandler('input-filter', true) - @registerEventEnableStatusChangeHandler('input') + @registerEventEnableStatusChangeHandler('lynxinput') #handleEnableConfirmEvent(status: string | boolean | null) { const textareaElement = this.#getTextareaElement(); if (status) { @@ -83,7 +83,7 @@ export class XTextareaEvents input.value = filterValue; if (isComposing && !this.#sendComposingInput) return; this.#dom.dispatchEvent( - new CustomEvent('input', { + new CustomEvent('lynxinput', { ...commonComponentEventSetting, detail: { value: filterValue, @@ -109,7 +109,7 @@ export class XTextareaEvents // if #sendComposingInput set true, #teleportInput will send detail if (!this.#sendComposingInput) { this.#dom.dispatchEvent( - new CustomEvent('input', { + new CustomEvent('lynxinput', { ...commonComponentEventSetting, detail: { value: filterValue, diff --git a/packages/web-platform/web-tests/tests/react/basic-element-x-input-bindinput/index.jsx b/packages/web-platform/web-tests/tests/react/basic-element-x-input-bindinput/index.jsx index abfecb919d..5f133678de 100644 --- a/packages/web-platform/web-tests/tests/react/basic-element-x-input-bindinput/index.jsx +++ b/packages/web-platform/web-tests/tests/react/basic-element-x-input-bindinput/index.jsx @@ -8,6 +8,12 @@ function App() { const [result, setResult] = useState(); const onInput = ({ detail }) => { + if (typeof detail !== 'object') { + throw new Error( + `detail type not match. expect object, got ${typeof detail}`, + ); + } + const { value, cursor, textLength, selectionStart, selectionEnd } = detail; if (value.length !== textLength) { diff --git a/packages/web-platform/web-tests/tests/react/basic-element-x-textarea-bindinput/index.jsx b/packages/web-platform/web-tests/tests/react/basic-element-x-textarea-bindinput/index.jsx index 6c081e61d4..f2c470f3ca 100644 --- a/packages/web-platform/web-tests/tests/react/basic-element-x-textarea-bindinput/index.jsx +++ b/packages/web-platform/web-tests/tests/react/basic-element-x-textarea-bindinput/index.jsx @@ -6,6 +6,11 @@ import './index.css'; function App() { const onInput = (e) => { + if (typeof e.detail !== 'object') { + throw new Error( + `detail type not match. expect object, got ${typeof detail}`, + ); + } console.log(e); }; diff --git a/packages/web-platform/web-tests/tests/web-elements.spec.ts b/packages/web-platform/web-tests/tests/web-elements.spec.ts index 59256ea0f1..20ae5fecfe 100644 --- a/packages/web-platform/web-tests/tests/web-elements.spec.ts +++ b/packages/web-platform/web-tests/tests/web-elements.spec.ts @@ -2701,7 +2701,7 @@ test.describe('web-elements test suite', () => { .locator('#target') .evaluateHandle((target) => { let detail = { value: undefined }; - target.addEventListener('input', (e) => { + target.addEventListener('lynxinput', (e) => { detail.value = (e as any).detail.value; }); return detail; diff --git a/packages/web-platform/web-tests/tests/web-elements/x-textarea/event-input.html b/packages/web-platform/web-tests/tests/web-elements/x-textarea/event-input.html index 6ff456629e..79d3a1d0f2 100644 --- a/packages/web-platform/web-tests/tests/web-elements/x-textarea/event-input.html +++ b/packages/web-platform/web-tests/tests/web-elements/x-textarea/event-input.html @@ -34,7 +34,7 @@