@@ -442,9 +442,7 @@ export class DragRef<T = any> {
442442 this . _ngZone . runOutsideAngular ( ( ) => {
443443 element . addEventListener ( 'mousedown' , this . _pointerDown , activeEventListenerOptions ) ;
444444 element . addEventListener ( 'touchstart' , this . _pointerDown , passiveEventListenerOptions ) ;
445- // Usually this isn't necessary since the we prevent the default action in `pointerDown`,
446- // but some cases like dragging of links can slip through (see #24403).
447- element . addEventListener ( 'dragstart' , preventDefault , activeEventListenerOptions ) ;
445+ element . addEventListener ( 'dragstart' , this . _nativeDragStart , activeEventListenerOptions ) ;
448446 } ) ;
449447 this . _initialTransform = undefined ;
450448 this . _rootElement = element ;
@@ -631,9 +629,7 @@ export class DragRef<T = any> {
631629
632630 // Delegate the event based on whether it started from a handle or the element itself.
633631 if ( this . _handles . length ) {
634- const targetHandle = this . _handles . find ( handle => {
635- return event . target && ( event . target === handle || handle . contains ( event . target as Node ) ) ;
636- } ) ;
632+ const targetHandle = this . _getTargetHandle ( event ) ;
637633
638634 if ( targetHandle && ! this . _disabledHandles . has ( targetHandle ) && ! this . disabled ) {
639635 this . _initializeDragSequence ( targetHandle , event ) ;
@@ -1287,7 +1283,7 @@ export class DragRef<T = any> {
12871283 private _removeRootElementListeners ( element : HTMLElement ) {
12881284 element . removeEventListener ( 'mousedown' , this . _pointerDown , activeEventListenerOptions ) ;
12891285 element . removeEventListener ( 'touchstart' , this . _pointerDown , passiveEventListenerOptions ) ;
1290- element . removeEventListener ( 'dragstart' , preventDefault , activeEventListenerOptions ) ;
1286+ element . removeEventListener ( 'dragstart' , this . _nativeDragStart , activeEventListenerOptions ) ;
12911287 }
12921288
12931289 /**
@@ -1512,6 +1508,28 @@ export class DragRef<T = any> {
15121508
15131509 return this . _previewRect ;
15141510 }
1511+
1512+ /** Handles a native `dragstart` event. */
1513+ private _nativeDragStart = ( event : DragEvent ) => {
1514+ if ( this . _handles . length ) {
1515+ const targetHandle = this . _getTargetHandle ( event ) ;
1516+
1517+ if ( targetHandle && ! this . _disabledHandles . has ( targetHandle ) && ! this . disabled ) {
1518+ event . preventDefault ( ) ;
1519+ }
1520+ } else if ( ! this . disabled ) {
1521+ // Usually this isn't necessary since the we prevent the default action in `pointerDown`,
1522+ // but some cases like dragging of links can slip through (see #24403).
1523+ event . preventDefault ( ) ;
1524+ }
1525+ } ;
1526+
1527+ /** Gets a handle that is the target of an event. */
1528+ private _getTargetHandle ( event : Event ) : HTMLElement | undefined {
1529+ return this . _handles . find ( handle => {
1530+ return event . target && ( event . target === handle || handle . contains ( event . target as Node ) ) ;
1531+ } ) ;
1532+ }
15151533}
15161534
15171535/**
@@ -1564,8 +1582,3 @@ function matchElementSize(target: HTMLElement, sourceRect: ClientRect): void {
15641582 target . style . height = `${ sourceRect . height } px` ;
15651583 target . style . transform = getTransform ( sourceRect . left , sourceRect . top ) ;
15661584}
1567-
1568- /** Utility to prevent the default action of an event. */
1569- function preventDefault ( event : Event ) : void {
1570- event . preventDefault ( ) ;
1571- }
0 commit comments