@@ -76,45 +76,58 @@ const switchPageAndUpdateSystem = (href: string, formData?: FormData) => {
76
76
77
77
export const subscribeInterceptedEvents = ( ) => {
78
78
const handleClick = ( event : MouseEvent ) => {
79
- if ( event . target instanceof Element && ! $isPreviewMode . get ( ) ) {
80
- // Prevent forwarding the click event on an input element when the associated label has a "for" attribute
81
- // and prevent checkbox or radio inputs changing when clicked
82
- if ( event . target . closest ( "label[for]" ) || event . target . closest ( "input" ) ) {
83
- event . preventDefault ( ) ;
79
+ if ( ! ( event . target instanceof Element ) ) {
80
+ return ;
81
+ }
82
+ const isPreviewMode = $isPreviewMode . get ( ) ;
83
+
84
+ // Prevent forwarding the click event on an input element when the associated label has a "for" attribute
85
+ // and prevent checkbox or radio inputs changing when clicked
86
+ if ( event . target . closest ( "label[for]" ) || event . target . closest ( "input" ) ) {
87
+ if ( isPreviewMode ) {
88
+ return ;
84
89
}
90
+ event . preventDefault ( ) ;
85
91
}
86
92
87
- if (
88
- event . target instanceof HTMLElement ||
89
- event . target instanceof SVGElement
90
- ) {
91
- const a = event . target . closest ( "a" ) ;
92
- if ( a ) {
93
- event . preventDefault ( ) ;
94
- if ( $isPreviewMode . get ( ) ) {
95
- // use attribute instead of a.href to get raw unresolved value
96
- const href = a . getAttribute ( "href" ) ?? "" ;
97
- if ( isAbsoluteUrl ( href ) ) {
98
- window . open ( href , "_blank" ) ;
99
- } else {
100
- switchPageAndUpdateSystem ( href ) ;
101
- }
93
+ const a = event . target . closest ( "a" ) ;
94
+ if ( a ) {
95
+ if ( isPreviewMode ) {
96
+ // use attribute instead of a.href to get raw unresolved value
97
+ const href = a . getAttribute ( "href" ) ?? "" ;
98
+ if ( isAbsoluteUrl ( href ) ) {
99
+ window . open ( href , "_blank" ) ;
100
+ // relative paths can be safely downloaded
101
+ } else if ( a . hasAttribute ( "download" ) ) {
102
+ return ;
103
+ } else {
104
+ switchPageAndUpdateSystem ( href ) ;
102
105
}
103
- }
104
- // prevent invoking submit with buttons in canvas mode
105
- // because form with prevented submit still invokes validation
106
- if ( event . target . closest ( "button" ) && $isPreviewMode . get ( ) === false ) {
107
106
event . preventDefault ( ) ;
107
+ return ;
108
108
}
109
+ event . preventDefault ( ) ;
110
+ }
111
+ // prevent invoking submit with buttons in canvas mode
112
+ // because form with prevented submit still invokes validation
113
+ if ( event . target . closest ( "button" ) ) {
114
+ if ( isPreviewMode ) {
115
+ return ;
116
+ }
117
+ event . preventDefault ( ) ;
109
118
}
110
119
} ;
111
120
112
121
const handlePointerDown = ( event : PointerEvent ) => {
113
- if ( false === event . target instanceof HTMLElement ) {
122
+ if ( ! ( event . target instanceof Element ) ) {
114
123
return ;
115
124
}
125
+ const isPreviewMode = $isPreviewMode . get ( ) ;
116
126
117
- if ( event . target . closest ( "select" ) && $isPreviewMode . get ( ) === false ) {
127
+ if ( event . target . closest ( "select" ) ) {
128
+ if ( isPreviewMode ) {
129
+ return ;
130
+ }
118
131
event . preventDefault ( ) ;
119
132
}
120
133
} ;
@@ -140,16 +153,14 @@ export const subscribeInterceptedEvents = () => {
140
153
} ;
141
154
142
155
const handleKeydown = ( event : KeyboardEvent ) => {
156
+ if ( ! ( event . target instanceof Element ) ) {
157
+ return ;
158
+ }
143
159
if ( $isPreviewMode . get ( ) ) {
144
160
return ;
145
161
}
146
162
// prevent typing in inputs only in canvas mode
147
- if (
148
- event . target instanceof HTMLInputElement ||
149
- event . target instanceof HTMLTextAreaElement
150
- ) {
151
- event . preventDefault ( ) ;
152
- }
163
+ event . preventDefault ( ) ;
153
164
} ;
154
165
155
166
// Note: Event handlers behave unexpectedly when used inside a dialog component.
0 commit comments