@@ -10,9 +10,19 @@ options.vnode = (vnode) => {
1010 if ( oldHook ) oldHook ( vnode )
1111}
1212
13- // Renames event to match React (preact/compat) version
14- const renameEventCompat = ( key ) => {
15- return key === 'change' ? 'input' : key
13+ // Matches the behavior of `preact/compat`:
14+ // https://github.com/preactjs/preact/blob/2459326755dea9ad6184b42bda1128c5004b8544/compat/src/render.js#L173-L175
15+ // https://github.com/preactjs/preact/blob/2459326755dea9ad6184b42bda1128c5004b8544/compat/src/render.js#L36-L37
16+ const maybeAliasKey = ( key , elem ) => {
17+ if (
18+ key === 'change' &&
19+ ( elem . tagName === 'INPUT' || elem . tagName === 'TEXTAREA' ) &&
20+ ! / f i l | c h e | r a d / . test ( elem . type )
21+ ) {
22+ return 'input'
23+ }
24+
25+ return key ;
1626}
1727
1828// Similar to RTL we make are own fireEvent helper that just calls DTL's fireEvent with that
@@ -26,16 +36,15 @@ Object.keys(domFireEvent).forEach((key) => {
2636 // we hit the Preact listeners.
2737 const eventName = `on${ key . toLowerCase ( ) } `
2838 const isInElem = eventName in elem
29- // Preact changes all change events to input events when running 'preact/compat',
30- // making the event name out of sync.
31- // The problematic code is in: preact/compat/src/render.js > handleDomVNode()
32- const keyFiltered = ! isCompat ? key : renameEventCompat ( key )
39+
40+ // Preact aliases some change events when using `preact/compat` to mirror React's behavior
41+ const maybeAliasedKey = ! isCompat ? key : maybeAliasKey ( key , elem )
3342
3443 return isInElem
35- ? domFireEvent [ keyFiltered ] ( elem , init )
44+ ? domFireEvent [ maybeAliasedKey ] ( elem , init )
3645 : domFireEvent (
3746 elem ,
38- createEvent ( keyFiltered [ 0 ] . toUpperCase ( ) + keyFiltered . slice ( 1 ) , elem , init )
47+ createEvent ( maybeAliasedKey [ 0 ] . toUpperCase ( ) + maybeAliasedKey . slice ( 1 ) , elem , init )
3948 )
4049 }
4150} )
0 commit comments