@ -16,19 +16,17 @@ import {
set _hydrating
} from './dom/hydration.js' ;
import { array _from } from './utils.js' ;
import { handle _event _propagation } from './dom/elements/events.js' ;
import {
all _registered _events ,
handle _event _propagation ,
root _event _handles
} from './dom/elements/events.js' ;
import { reset _head _anchor } from './dom/blocks/svelte-head.js' ;
import * as w from './warnings.js' ;
import * as e from './errors.js' ;
import { validate _component } from '../shared/validate.js' ;
import { assign _nodes } from './dom/template.js' ;
/** @type {Set<string>} */
export const all _registered _events = new Set ( ) ;
/** @type {Set<(events: Array<string>) => void>} */
export const root _event _handles = new Set ( ) ;
/ * *
* This is normally true — block effects should run their intro transitions —
* but is false during hydration ( unless ` options.intro ` is ` true ` ) and
@ -181,6 +179,8 @@ export function hydrate(component, options) {
}
}
const document _listeners = new Set ( ) ;
/ * *
* @ template { Record < string , any > } Exports
* @ param { import ( '../../index.js' ) . ComponentType < import ( '../../index.js' ) . SvelteComponent < any >> | import ( '../../index.js' ) . Component < any > } Component
@ -213,9 +213,13 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro
// the outer content stops propagation of the event.
target . addEventListener ( event _name , handle _event _propagation , { passive } ) ;
// The document listener ensures we catch events that originate from elements that were
// manually moved outside of the container (e.g. via manual portals).
document . addEventListener ( event _name , handle _event _propagation , { passive } ) ;
if ( ! document _listeners . has ( event _name ) ) {
document _listeners . add ( event _name ) ;
// The document listener ensures we catch events that originate from elements that were
// manually moved outside of the container (e.g. via manual portals).
document . addEventListener ( event _name , handle _event _propagation , { passive } ) ;
}
}
}
} ;
@ -263,7 +267,8 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro
return ( ) => {
for ( const event _name of registered _events ) {
target . removeEventListener ( event _name , handle _event _propagation ) ;
document . removeEventListener ( event _name , handle _event _propagation ) ;
// Don't remove document event listeners, they're global per runtime,
// and we don't know whether or not there are other components still using them
}
root _event _handles . delete ( event _handle ) ;