@@ -8,10 +8,12 @@ import {
88 DEFAULT_ACTION_CLICK_ALLOWLIST ,
99 DEFAULT_DATA_ATTRIBUTE_PREFIX ,
1010 IDiagnosticsClient ,
11+ getGlobalScope ,
12+ multicast ,
1113} from '@amplitude/analytics-core' ;
1214import { VERSION } from './version' ;
1315import * as constants from './constants' ;
14- import { fromEvent , map , type Observable , type Subscription , share } from 'rxjs' ;
16+ import { fromEvent , map , type Observable , share } from 'rxjs' ;
1517import {
1618 createShouldTrackEvent ,
1719 type ElementBasedTimestampedEvent ,
@@ -31,7 +33,7 @@ import {
3133 groupLabeledEventIdsByEventType ,
3234} from './pageActions/triggers' ;
3335import { DataExtractor } from './data-extractor' ;
34- import { Observable as ZenObservable } from '@amplitude/analytics-core' ;
36+ import { Observable as ZenObservable , Unsubscribable } from '@amplitude/analytics-core' ;
3537
3638declare global {
3739 interface Window {
@@ -59,7 +61,7 @@ export enum ObservablesEnum {
5961
6062export interface AllWindowObservables {
6163 [ ObservablesEnum . ClickObservable ] : Observable < ElementBasedTimestampedEvent < MouseEvent > > ;
62- [ ObservablesEnum . ChangeObservable ] : Observable < ElementBasedTimestampedEvent < Event > > ;
64+ [ ObservablesEnum . ChangeObservable ] : ZenObservable < ElementBasedTimestampedEvent < Event > > ;
6365 // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;
6466 [ ObservablesEnum . NavigateObservable ] : Observable < TimestampedEvent < NavigateEvent > > | undefined ;
6567 [ ObservablesEnum . MutationObservable ] : Observable < TimestampedEvent < MutationRecord [ ] > > ;
@@ -112,7 +114,7 @@ export const autocapturePlugin = (
112114 const name = constants . PLUGIN_NAME ;
113115 const type = 'enrichment' ;
114116
115- const subscriptions : Subscription [ ] = [ ] ;
117+ const subscriptions : Unsubscribable [ ] = [ ] ;
116118
117119 // Create data extractor based on options
118120 const dataExtractor = new DataExtractor ( options , context ) ;
@@ -131,16 +133,23 @@ export const autocapturePlugin = (
131133 ) ,
132134 share ( ) ,
133135 ) ;
134- const changeObservable = fromEvent < Event > ( document , 'change' , { capture : true } ) . pipe (
135- map ( ( change ) =>
136- dataExtractor . addAdditionalEventProperties (
137- change ,
138- 'change' ,
139- ( options as AutoCaptureOptionsWithDefaults ) . cssSelectorAllowlist ,
140- dataAttributePrefix ,
141- ) ,
142- ) ,
143- share ( ) ,
136+
137+ const changeObservable = multicast (
138+ new ZenObservable < ElementBasedTimestampedEvent < Event > > ( ( observer ) => {
139+ const handler = ( changeEvent : Event ) => {
140+ const enrichedChangeEvent = dataExtractor . addAdditionalEventProperties (
141+ changeEvent ,
142+ 'change' ,
143+ ( options as AutoCaptureOptionsWithDefaults ) . cssSelectorAllowlist ,
144+ dataAttributePrefix ,
145+ ) as ElementBasedTimestampedEvent < Event > ;
146+ observer . next ( enrichedChangeEvent ) ;
147+ } ;
148+ /* istanbul ignore next */
149+ getGlobalScope ( ) ?. document . addEventListener ( 'change' , handler , { capture : true } ) ;
150+ /* istanbul ignore next */
151+ return ( ) => getGlobalScope ( ) ?. document . removeEventListener ( 'change' , handler ) ;
152+ } ) ,
144153 ) ;
145154
146155 // Create Observable from unhandled errors
@@ -180,7 +189,7 @@ export const autocapturePlugin = (
180189
181190 return {
182191 [ ObservablesEnum . ClickObservable ] : clickObservable as Observable < ElementBasedTimestampedEvent < MouseEvent > > ,
183- [ ObservablesEnum . ChangeObservable ] : changeObservable as Observable < ElementBasedTimestampedEvent < Event > > ,
192+ [ ObservablesEnum . ChangeObservable ] : changeObservable ,
184193 // [ObservablesEnum.ErrorObservable]: errorObservable,
185194 [ ObservablesEnum . NavigateObservable ] : navigateObservable ,
186195 [ ObservablesEnum . MutationObservable ] : mutationObservable ,
0 commit comments