Unified · Split
| @@ -170,7 +170,7 @@ onclick = (event) -> · 169 unmodified lines | |||
| 170 | catch | 170 | catch |
| 171 | return | 171 | return |
| 172 | 172 | ||
| 173 | link = event.target | 173 | link = $.eventTarget(event) |
| 174 | link = link.parentNode while link and link.tagName isnt 'A' | 174 | link = link.parentNode while link and link.tagName isnt 'A' |
| 175 | 175 | ||
| 176 | if link and not link.target and isSameOrigin(link.href) | 176 | if link and not link.target and isSameOrigin(link.href) |
| @@ -60,6 +60,9 @@ $.stopEvent = (event) -> · 59 unmodified lines | |||
| 60 | event.stopImmediatePropagation() | 60 | event.stopImmediatePropagation() |
| 61 | return | 61 | return |
| 62 | 62 | ||
| 63 | $.eventTarget = (event) -> | ||
| 64 | event.target.correspondingUseElement || event.target | ||
| 65 | |||
| 63 | # | 66 | # |
| 64 | # Manipulation | 67 | # Manipulation |
| 65 | # | 68 | # |
| @@ -169,7 +169,7 @@ class app.views.Content extends app.View · 168 unmodified lines | |||
| 169 | return | 169 | return |
| 170 | 170 | ||
| 171 | onClick: (event) => | 171 | onClick: (event) => |
| 172 | link = $.closestLink event.target, @el | 172 | link = $.closestLink $.eventTarget(event), @el |
| 173 | if link and @isExternalUrl link.getAttribute('href') | 173 | if link and @isExternalUrl link.getAttribute('href') |
| 174 | $.stopEvent(event) | 174 | $.stopEvent(event) |
| 175 | $.popup(link) | 175 | $.popup(link) |
| @@ -140,7 +140,7 @@ class app.views.EntryPage extends app.View · 139 unmodified lines | |||
| 140 | true | 140 | true |
| 141 | 141 | ||
| 142 | onClick: (event) => | 142 | onClick: (event) => |
| 143 | target = event.target | 143 | target = $.eventTarget(event) |
| 144 | if target.hasAttribute 'data-retry' | 144 | if target.hasAttribute 'data-retry' |
| 145 | $.stopEvent(event) | 145 | $.stopEvent(event) |
| 146 | @load() | 146 | @load() |
| @@ -50,7 +50,7 @@ class app.views.OfflinePage extends app.View · 49 unmodified lines | |||
| 50 | return | 50 | return |
| 51 | 51 | ||
| 52 | onClick: (event) => | 52 | onClick: (event) => |
| 53 | el = event.target | 53 | el = $.eventTarget(event) |
| 54 | if action = el.getAttribute('data-action') | 54 | if action = el.getAttribute('data-action') |
| 55 | doc = @docByEl(el) | 55 | doc = @docByEl(el) |
| 56 | action = 'install' if action is 'update' | 56 | action = 'install' if action is 'update' |
| @@ -30,7 +30,7 @@ class app.views.RootPage extends app.View · 29 unmodified lines | |||
| 30 | onRoute: -> | 30 | onRoute: -> |
| 31 | 31 | ||
| 32 | onClick: (event) => | 32 | onClick: (event) => |
| 33 | if event.target.hasAttribute 'data-hide-intro' | 33 | if $.eventTarget(event).hasAttribute 'data-hide-intro' |
| 34 | $.stopEvent(event) | 34 | $.stopEvent(event) |
| 35 | @hideIntro() | 35 | @hideIntro() |
| 36 | return | 36 | return |
| @@ -71,9 +71,10 @@ class app.views.Document extends app.View · 70 unmodified lines | |||
| 71 | return | 71 | return |
| 72 | 72 | ||
| 73 | onClick: (event) -> | 73 | onClick: (event) -> |
| 74 | return unless event.target.hasAttribute('data-behavior') | 74 | target = $.eventTarget(event) |
| 75 | return unless target.hasAttribute('data-behavior') | ||
| 75 | $.stopEvent(event) | 76 | $.stopEvent(event) |
| 76 | switch event.target.getAttribute('data-behavior') | 77 | switch target.getAttribute('data-behavior') |
| 77 | when 'back' then history.back() | 78 | when 'back' then history.back() |
| 78 | when 'reload' then window.location.reload() | 79 | when 'reload' then window.location.reload() |
| 79 | when 'reboot' then window.location = '/' | 80 | when 'reboot' then window.location = '/' |
| @@ -10,7 +10,8 @@ class app.views.Menu extends app.View · 9 unmodified lines | |||
| 10 | return | 10 | return |
| 11 | 11 | ||
| 12 | onClick: (event) -> | 12 | onClick: (event) -> |
| 13 | event.target.blur() if event.target.tagName is 'A' | 13 | target = $.eventTarget(event) |
| 14 | target.blur() if target.tagName is 'A' | ||
| 14 | return | 15 | return |
| 15 | 16 | ||
| 16 | onGlobalClick: (event) => | 17 | onGlobalClick: (event) => |
| @@ -117,6 +117,7 @@ class app.views.ListFocus extends app.View · 116 unmodified lines | |||
| 117 | 117 | ||
| 118 | onClick: (event) => | 118 | onClick: (event) => |
| 119 | return if event.which isnt 1 or event.metaKey or event.ctrlKey | 119 | return if event.which isnt 1 or event.metaKey or event.ctrlKey |
| 120 | if event.target.tagName is 'A' | 120 | target = $.eventTarget(event) |
| 121 | @focus event.target, silent: true | 121 | if target.tagName is 'A' |
| 122 | @focus target, silent: true | ||
| 122 | return | 123 | return |
| @@ -54,7 +54,7 @@ class app.views.ListFold extends app.View · 53 unmodified lines | |||
| 54 | onClick: (event) => | 54 | onClick: (event) => |
| 55 | return if event.which isnt 1 or event.metaKey or event.ctrlKey | 55 | return if event.which isnt 1 or event.metaKey or event.ctrlKey |
| 56 | return unless event.pageY # ignore fabricated clicks | 56 | return unless event.pageY # ignore fabricated clicks |
| 57 | el = event.target | 57 | el = $.eventTarget(event) |
| 58 | el = el.parentNode if el.parentNode.tagName.toUpperCase() is 'SVG' | 58 | el = el.parentNode if el.parentNode.tagName.toUpperCase() is 'SVG' |
| 59 | 59 | ||
| 60 | if el.classList.contains @constructor.handleClass | 60 | if el.classList.contains @constructor.handleClass |
| @@ -37,6 +37,7 @@ class app.views.ListSelect extends app.View · 36 unmodified lines | |||
| 37 | 37 | ||
| 38 | onClick: (event) => | 38 | onClick: (event) => |
| 39 | return if event.which isnt 1 or event.metaKey or event.ctrlKey | 39 | return if event.which isnt 1 or event.metaKey or event.ctrlKey |
| 40 | if event.target.tagName is 'A' | 40 | target = $.eventTarget(event) |
| 41 | @select event.target | 41 | if target.tagName is 'A' |
| 42 | @select target | ||
| 42 | return | 43 | return |
| @@ -83,7 +83,8 @@ class app.views.PaginatedList extends app.View · 82 unmodified lines | |||
| 83 | return | 83 | return |
| 84 | 84 | ||
| 85 | onClick: (event) => | 85 | onClick: (event) => |
| 86 | if event.target.tagName is 'SPAN' # link | 86 | target = $.eventTarget(event) |
| 87 | if target.tagName is 'SPAN' # link | ||
| 87 | $.stopEvent(event) | 88 | $.stopEvent(event) |
| 88 | @paginate event.target | 89 | @paginate target |
| 89 | return | 90 | return |
| @@ -51,8 +51,9 @@ class app.views.Notif extends app.View · 50 unmodified lines | |||
| 51 | 51 | ||
| 52 | onClick: (event) => | 52 | onClick: (event) => |
| 53 | return if event.which isnt 1 | 53 | return if event.which isnt 1 |
| 54 | return if event.target.hasAttribute('data-behavior') | 54 | target = $.eventTarget(event) |
| 55 | if event.target.tagName isnt 'A' or event.target.classList.contains('_notif-close') | 55 | return if target.hasAttribute('data-behavior') |
| 56 | if target.tagName isnt 'A' or target.classList.contains('_notif-close') | ||
| 56 | $.stopEvent(event) | 57 | $.stopEvent(event) |
| 57 | @hide() | 58 | @hide() |
| 58 | return | 59 | return |
| @@ -164,10 +164,11 @@ class app.views.DocList extends app.View · 163 unmodified lines | |||
| 164 | return | 164 | return |
| 165 | 165 | ||
| 166 | onClick: (event) => | 166 | onClick: (event) => |
| 167 | if @disabledTitle and $.hasChild(@disabledTitle, event.target) and event.target.tagName isnt 'A' | 167 | target = $.eventTarget(event) |
| 168 | if @disabledTitle and $.hasChild(@disabledTitle, target) and target.tagName isnt 'A' | ||
| 168 | $.stopEvent(event) | 169 | $.stopEvent(event) |
| 169 | @toggleDisabled() | 170 | @toggleDisabled() |
| 170 | else if slug = event.target.getAttribute('data-enable') | 171 | else if slug = target.getAttribute('data-enable') |
| 171 | $.stopEvent(event) | 172 | $.stopEvent(event) |
| 172 | doc = app.disabledDocs.findBy('slug', slug) | 173 | doc = app.disabledDocs.findBy('slug', slug) |
| 173 | app.enableDoc(doc, @onEnabled, @onEnabled) if doc | 174 | app.enableDoc(doc, @onEnabled, @onEnabled) if doc |
| @@ -62,7 +62,7 @@ class app.views.Results extends app.View · 61 unmodified lines | |||
| 62 | 62 | ||
| 63 | onClick: (event) => | 63 | onClick: (event) => |
| 64 | return if event.which isnt 1 | 64 | return if event.which isnt 1 |
| 65 | if slug = event.target.getAttribute('data-enable') | 65 | if slug = $.eventTarget(event).getAttribute('data-enable') |
| 66 | $.stopEvent(event) | 66 | $.stopEvent(event) |
| 67 | doc = app.disabledDocs.findBy('slug', slug) | 67 | doc = app.disabledDocs.findBy('slug', slug) |
| 68 | app.enableDoc(doc, @onDocEnabled.bind(@, doc), $.noop) if doc | 68 | app.enableDoc(doc, @onDocEnabled.bind(@, doc), $.noop) if doc |
| @@ -131,7 +131,7 @@ class app.views.Sidebar extends app.View · 130 unmodified lines | |||
| 131 | 131 | ||
| 132 | onClick: (event) => | 132 | onClick: (event) => |
| 133 | return if event.which isnt 1 | 133 | return if event.which isnt 1 |
| 134 | if event.target.hasAttribute? 'data-reset-list' | 134 | if $.eventTarget(event).hasAttribute? 'data-reset-list' |
| 135 | $.stopEvent(event) | 135 | $.stopEvent(event) |
| 136 | @onAltR() | 136 | @onAltR() |
| 137 | return | 137 | return |