6
6
import { BaseSignal , Ref } from "../signals/signal" ;
7
7
import { Fiber , FiberChildren } from "../types" ;
8
8
import { isPrimitive } from "../utils/general" ;
9
+ import { CAPTURE_REGEX } from "./constants" ;
9
10
import {
10
11
FRAGMENT_SYMBOL ,
11
12
createChildren ,
@@ -263,11 +264,18 @@ function commitDeletion(fiber: Fiber, toClearReactiveFunction?: boolean) {
263
264
delete fiber . renderFunction ;
264
265
}
265
266
if ( fiber . dom ) {
266
- for ( const prop of Object . keys ( fiber . props ) ) {
267
+ for ( const prop in fiber . props ) {
267
268
if ( isEvent ( prop ) ) {
268
- const eventName = prop . toLowerCase ( ) . substring ( 2 ) ;
269
-
270
- fiber . dom . removeEventListener ( eventName , fiber . props [ prop ] ) ;
269
+ let eventName = prop . toLowerCase ( ) . substring ( 2 ) ;
270
+ const useCapture =
271
+ eventName !=
272
+ ( eventName = eventName . replace ( CAPTURE_REGEX , "$1" ) ) ;
273
+
274
+ fiber . dom . removeEventListener (
275
+ eventName ,
276
+ fiber . props [ prop ] ,
277
+ useCapture
278
+ ) ;
271
279
delete fiber . props [ prop ] ;
272
280
} else if ( typeof fiber . props [ prop ] === "function" ) {
273
281
clearReactiveAttributes ( fiber . props [ prop ] ) ;
@@ -348,7 +356,8 @@ function replaceChildFromParent(prev: Fiber, next: Fiber, index?: number) {
348
356
} ) ;
349
357
}
350
358
351
- export const isEvent = ( key : string ) => key . startsWith ( "on" ) ;
359
+ export const isEvent = ( key : string ) =>
360
+ key . startsWith ( "on" ) || key == "onFocusOut" || key == "onFocusIn" ;
352
361
export const isProperty = ( key : string ) =>
353
362
key !== "children" && ! isEvent ( key ) && key !== "key" && key !== "ref" ;
354
363
const isNew = ( prev : any , next : any , key : string ) => prev [ key ] !== next [ key ] ;
@@ -400,7 +409,7 @@ function deepEqual(objA: any, objB: any): boolean {
400
409
401
410
for ( let key of keysA ) {
402
411
if ( key === "children" ) continue ;
403
- if ( ! keysB . includes ( key ) ) return false ; // Missing key in one of them
412
+ if ( ! objB . hasOwnProperty ( key ) ) return false ; // Missing key in one of them
404
413
if ( ! deepEqual ( objA [ key ] , objB [ key ] ) ) return false ; // Recurse for nested objects/arrays
405
414
}
406
415
@@ -540,7 +549,7 @@ function updateNode(
540
549
} else {
541
550
// console.log("Node-Node");
542
551
// remove old properties and event listeners from NODE
543
- for ( const prop of Object . keys ( prevProps ) ) {
552
+ for ( const prop in prevProps ) {
544
553
if (
545
554
isProperty ( prop ) &&
546
555
isGone ( prevProps , nextProps , prop )
@@ -552,9 +561,19 @@ function updateNode(
552
561
( ! ( prop in nextProps ) ||
553
562
isNew ( prevProps , nextProps , prop ) )
554
563
) {
555
- const eventName = prop . toLowerCase ( ) . substring ( 2 ) ;
556
-
557
- node . removeEventListener ( eventName , prevProps [ prop ] ) ;
564
+ let eventName = prop . toLowerCase ( ) . substring ( 2 ) ;
565
+ const useCapture =
566
+ eventName !=
567
+ ( eventName = eventName . replace (
568
+ CAPTURE_REGEX ,
569
+ "$1"
570
+ ) ) ;
571
+
572
+ node . removeEventListener (
573
+ eventName ,
574
+ prevProps [ prop ] ,
575
+ useCapture
576
+ ) ;
558
577
// console.log("event listener removed", prop);
559
578
}
560
579
}
@@ -573,7 +592,7 @@ function updateNode(
573
592
// add new properties
574
593
// console.log("same type", prev, next);
575
594
576
- for ( const prop of Object . keys ( nextProps ) ) {
595
+ for ( const prop in nextProps ) {
577
596
if (
578
597
isProperty ( prop ) &&
579
598
isNew ( prevProps , nextProps , prop )
@@ -589,9 +608,18 @@ function updateNode(
589
608
isEvent ( prop ) &&
590
609
isNew ( prevProps , nextProps , prop )
591
610
) {
592
- const eventName = prop . toLowerCase ( ) . substring ( 2 ) ;
593
- // console.log("event listener added", prop);
594
- node . addEventListener ( eventName , nextProps [ prop ] ) ;
611
+ let eventName = prop . toLowerCase ( ) . substring ( 2 ) ;
612
+ const useCapture =
613
+ eventName !=
614
+ ( eventName = eventName . replace (
615
+ CAPTURE_REGEX ,
616
+ "$1"
617
+ ) ) ;
618
+ node . addEventListener (
619
+ eventName ,
620
+ nextProps [ prop ] ,
621
+ useCapture
622
+ ) ;
595
623
prevProps [ prop ] = nextProps [ prop ] ;
596
624
}
597
625
}
0 commit comments