Skip to content
GitLab
Explore
Projects
Groups
Snippets
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Bootstrap
bootstrap
Commits
e58b47cf
Commit
e58b47cf
authored
6 years ago
by
Johann-S
Committed by
XhmikosR
6 years ago
Browse files
Options
Download
Email Patches
Plain Diff
improve event handler
parent
30861cbc
5 merge requests
!31948
Examples/Floating-labels: fix bad behavior with autofill
,
!30064
test
,
!29779
Responsive sizing
,
!28882
fix custom-select-indicator in IE10
,
!28721
Hot test
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
js/src/dom/eventHandler.js
+38
-56
js/src/dom/eventHandler.js
with
38 additions
and
56 deletions
+38
-56
js/src/dom/eventHandler.js
+
38
-
56
View file @
e58b47cf
import
Polyfill
from
'
./polyfill
'
import
Util
from
'
../util
'
/**
/**
* --------------------------------------------------------------------------
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): dom/eventHandler.js
* Bootstrap (v4.3.1): dom/eventHandler.js
...
@@ -8,6 +5,9 @@ import Util from '../util'
...
@@ -8,6 +5,9 @@ import Util from '../util'
* --------------------------------------------------------------------------
* --------------------------------------------------------------------------
*/
*/
import
Polyfill
from
'
./polyfill
'
import
Util
from
'
../util
'
/**
/**
* ------------------------------------------------------------------------
* ------------------------------------------------------------------------
* Constants
* Constants
...
@@ -78,10 +78,12 @@ function bootstrapHandler(element, fn) {
...
@@ -78,10 +78,12 @@ function bootstrapHandler(element, fn) {
function
bootstrapDelegationHandler
(
element
,
selector
,
fn
)
{
function
bootstrapDelegationHandler
(
element
,
selector
,
fn
)
{
return
function
handler
(
event
)
{
return
function
handler
(
event
)
{
const
domElements
=
element
.
querySelectorAll
(
selector
)
const
domElements
=
element
.
querySelectorAll
(
selector
)
for
(
let
target
=
event
.
target
;
target
&&
target
!==
this
;
target
=
target
.
parentNode
)
{
for
(
let
target
=
event
.
target
;
target
&&
target
!==
this
;
target
=
target
.
parentNode
)
{
for
(
let
i
=
domElements
.
length
;
i
--
;)
{
for
(
let
i
=
domElements
.
length
;
i
--
;)
{
if
(
domElements
[
i
]
===
target
)
{
if
(
domElements
[
i
]
===
target
)
{
fixEvent
(
event
,
target
)
fixEvent
(
event
,
target
)
if
(
handler
.
oneOff
)
{
if
(
handler
.
oneOff
)
{
EventHandler
.
off
(
element
,
event
.
type
,
fn
)
EventHandler
.
off
(
element
,
event
.
type
,
fn
)
}
}
...
@@ -97,12 +99,12 @@ function bootstrapDelegationHandler(element, selector, fn) {
...
@@ -97,12 +99,12 @@ function bootstrapDelegationHandler(element, selector, fn) {
}
}
function
findHandler
(
events
,
handler
,
delegationSelector
=
null
)
{
function
findHandler
(
events
,
handler
,
delegationSelector
=
null
)
{
for
(
const
uid
in
events
)
{
const
uidList
=
Object
.
keys
(
events
)
if
(
!
Object
.
prototype
.
hasOwnProperty
.
call
(
events
,
uid
))
{
continue
}
for
(
let
i
=
0
;
i
<
uidList
.
length
;
i
++
)
{
const
uid
=
uidList
[
i
]
const
event
=
events
[
uid
]
const
event
=
events
[
uid
]
if
(
event
.
originalHandler
===
handler
&&
event
.
delegationSelector
===
delegationSelector
)
{
if
(
event
.
originalHandler
===
handler
&&
event
.
delegationSelector
===
delegationSelector
)
{
return
events
[
uid
]
return
events
[
uid
]
}
}
...
@@ -112,18 +114,19 @@ function findHandler(events, handler, delegationSelector = null) {
...
@@ -112,18 +114,19 @@ function findHandler(events, handler, delegationSelector = null) {
}
}
function
normalizeParams
(
originalTypeEvent
,
handler
,
delegationFn
)
{
function
normalizeParams
(
originalTypeEvent
,
handler
,
delegationFn
)
{
const
delegation
=
typeof
handler
===
'
string
'
const
delegation
=
typeof
handler
===
'
string
'
const
originalHandler
=
delegation
?
delegationFn
:
handler
const
originalHandler
=
delegation
?
delegationFn
:
handler
// allow to get the native events from namespaced events ('click.bs.button' --> 'click')
// allow to get the native events from namespaced events ('click.bs.button' --> 'click')
let
typeEvent
=
originalTypeEvent
.
replace
(
stripNameRegex
,
''
)
let
typeEvent
=
originalTypeEvent
.
replace
(
stripNameRegex
,
''
)
const
custom
=
customEvents
[
typeEvent
]
const
custom
=
customEvents
[
typeEvent
]
if
(
custom
)
{
if
(
custom
)
{
typeEvent
=
custom
typeEvent
=
custom
}
}
const
isNative
=
nativeEvents
.
indexOf
(
typeEvent
)
>
-
1
const
isNative
=
nativeEvents
.
indexOf
(
typeEvent
)
>
-
1
if
(
!
isNative
)
{
if
(
!
isNative
)
{
typeEvent
=
originalTypeEvent
typeEvent
=
originalTypeEvent
}
}
...
@@ -142,13 +145,13 @@ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
...
@@ -142,13 +145,13 @@ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
}
}
const
[
delegation
,
originalHandler
,
typeEvent
]
=
normalizeParams
(
originalTypeEvent
,
handler
,
delegationFn
)
const
[
delegation
,
originalHandler
,
typeEvent
]
=
normalizeParams
(
originalTypeEvent
,
handler
,
delegationFn
)
const
events
=
getEvent
(
element
)
const
events
=
getEvent
(
element
)
const
handlers
=
events
[
typeEvent
]
||
(
events
[
typeEvent
]
=
{})
const
handlers
=
events
[
typeEvent
]
||
(
events
[
typeEvent
]
=
{})
const
previousFn
=
findHandler
(
handlers
,
originalHandler
,
delegation
?
handler
:
null
)
const
previousFn
=
findHandler
(
handlers
,
originalHandler
,
delegation
?
handler
:
null
)
if
(
previousFn
)
{
if
(
previousFn
)
{
previousFn
.
oneOff
=
previousFn
.
oneOff
&&
oneOff
previousFn
.
oneOff
=
previousFn
.
oneOff
&&
oneOff
return
return
}
}
...
@@ -166,6 +169,7 @@ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
...
@@ -166,6 +169,7 @@ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
function
removeHandler
(
element
,
events
,
typeEvent
,
handler
,
delegationSelector
)
{
function
removeHandler
(
element
,
events
,
typeEvent
,
handler
,
delegationSelector
)
{
const
fn
=
findHandler
(
events
[
typeEvent
],
handler
,
delegationSelector
)
const
fn
=
findHandler
(
events
[
typeEvent
],
handler
,
delegationSelector
)
if
(
fn
===
null
)
{
if
(
fn
===
null
)
{
return
return
}
}
...
@@ -176,16 +180,15 @@ function removeHandler(element, events, typeEvent, handler, delegationSelector)
...
@@ -176,16 +180,15 @@ function removeHandler(element, events, typeEvent, handler, delegationSelector)
function
removeNamespacedHandlers
(
element
,
events
,
typeEvent
,
namespace
)
{
function
removeNamespacedHandlers
(
element
,
events
,
typeEvent
,
namespace
)
{
const
storeElementEvent
=
events
[
typeEvent
]
||
{}
const
storeElementEvent
=
events
[
typeEvent
]
||
{}
for
(
const
handlerKey
in
storeElementEvent
)
{
if
(
!
Object
.
prototype
.
hasOwnProperty
.
call
(
storeElementEvent
,
handlerKey
))
{
continue
}
if
(
handlerKey
.
indexOf
(
namespace
)
>
-
1
)
{
Object
.
keys
(
storeElementEvent
)
const
event
=
storeElementEvent
[
handlerKey
]
.
forEach
((
handlerKey
)
=>
{
removeHandler
(
element
,
events
,
typeEvent
,
event
.
originalHandler
,
event
.
delegationSelector
)
if
(
handlerKey
.
indexOf
(
namespace
)
>
-
1
)
{
}
const
event
=
storeElementEvent
[
handlerKey
]
}
removeHandler
(
element
,
events
,
typeEvent
,
event
.
originalHandler
,
event
.
delegationSelector
)
}
})
}
}
const
EventHandler
=
{
const
EventHandler
=
{
...
@@ -203,9 +206,9 @@ const EventHandler = {
...
@@ -203,9 +206,9 @@ const EventHandler = {
}
}
const
[
delegation
,
originalHandler
,
typeEvent
]
=
normalizeParams
(
originalTypeEvent
,
handler
,
delegationFn
)
const
[
delegation
,
originalHandler
,
typeEvent
]
=
normalizeParams
(
originalTypeEvent
,
handler
,
delegationFn
)
const
inNamespace
=
typeEvent
!==
originalTypeEvent
const
inNamespace
=
typeEvent
!==
originalTypeEvent
const
events
=
getEvent
(
element
)
const
events
=
getEvent
(
element
)
const
isNamespace
=
originalTypeEvent
.
charAt
(
0
)
===
'
.
'
if
(
typeof
originalHandler
!==
'
undefined
'
)
{
if
(
typeof
originalHandler
!==
'
undefined
'
)
{
// Simplest case: handler is passed, remove that listener ONLY.
// Simplest case: handler is passed, remove that listener ONLY.
...
@@ -217,29 +220,24 @@ const EventHandler = {
...
@@ -217,29 +220,24 @@ const EventHandler = {
return
return
}
}
const
isNamespace
=
originalTypeEvent
.
charAt
(
0
)
===
'
.
'
if
(
isNamespace
)
{
if
(
isNamespace
)
{
for
(
const
elementEvent
in
events
)
{
Object
.
keys
(
events
)
if
(
!
Object
.
prototype
.
hasOwnProperty
.
call
(
events
,
elementEvent
))
{
.
forEach
((
elementEvent
)
=>
{
continue
removeNamespacedHandlers
(
element
,
events
,
elementEvent
,
originalTypeEvent
.
substr
(
1
))
}
})
removeNamespacedHandlers
(
element
,
events
,
elementEvent
,
originalTypeEvent
.
substr
(
1
))
}
}
}
const
storeElementEvent
=
events
[
typeEvent
]
||
{}
const
storeElementEvent
=
events
[
typeEvent
]
||
{}
for
(
const
keyHandlers
in
storeElementEvent
)
{
Object
.
keys
(
storeElementEvent
)
if
(
!
Object
.
prototype
.
hasOwnProperty
.
call
(
storeElementEvent
,
keyHandlers
))
{
.
forEach
((
keyHandlers
)
=>
{
continue
const
handlerKey
=
keyHandlers
.
replace
(
stripUidRegex
,
''
)
}
const
handlerKey
=
keyHandlers
.
replace
(
stripUidRegex
,
''
)
if
(
!
inNamespace
||
originalTypeEvent
.
indexOf
(
handlerKey
)
>
-
1
)
{
if
(
!
inNamespace
||
originalTypeEvent
.
indexOf
(
handlerKey
)
>
-
1
)
{
const
event
=
storeElementEvent
[
keyHandlers
]
const
event
=
storeElementEvent
[
keyHandlers
]
removeHandler
(
element
,
events
,
typeEvent
,
event
.
originalHandler
,
event
.
delegationSelector
)
removeHandler
(
element
,
events
,
typeEvent
,
event
.
originalHandler
,
event
.
delegationSelector
)
}
}
}
})
},
},
trigger
(
element
,
event
,
args
)
{
trigger
(
element
,
event
,
args
)
{
...
@@ -250,13 +248,13 @@ const EventHandler = {
...
@@ -250,13 +248,13 @@ const EventHandler = {
const
typeEvent
=
event
.
replace
(
stripNameRegex
,
''
)
const
typeEvent
=
event
.
replace
(
stripNameRegex
,
''
)
const
inNamespace
=
event
!==
typeEvent
const
inNamespace
=
event
!==
typeEvent
const
isNative
=
nativeEvents
.
indexOf
(
typeEvent
)
>
-
1
const
isNative
=
nativeEvents
.
indexOf
(
typeEvent
)
>
-
1
const
$
=
Util
.
jQuery
const
$
=
Util
.
jQuery
let
jQueryEvent
let
jQueryEvent
let
bubbles
=
true
let
bubbles
=
true
let
nativeDispatch
=
true
let
nativeDispatch
=
true
let
defaultPrevented
=
false
let
defaultPrevented
=
false
let
evt
=
null
if
(
inNamespace
&&
typeof
$
!==
'
undefined
'
)
{
if
(
inNamespace
&&
typeof
$
!==
'
undefined
'
)
{
jQueryEvent
=
$
.
Event
(
event
,
args
)
jQueryEvent
=
$
.
Event
(
event
,
args
)
...
@@ -267,7 +265,6 @@ const EventHandler = {
...
@@ -267,7 +265,6 @@ const EventHandler = {
defaultPrevented
=
jQueryEvent
.
isDefaultPrevented
()
defaultPrevented
=
jQueryEvent
.
isDefaultPrevented
()
}
}
let
evt
=
null
if
(
isNative
)
{
if
(
isNative
)
{
evt
=
document
.
createEvent
(
'
HTMLEvents
'
)
evt
=
document
.
createEvent
(
'
HTMLEvents
'
)
evt
.
initEvent
(
typeEvent
,
bubbles
,
true
)
evt
.
initEvent
(
typeEvent
,
bubbles
,
true
)
...
@@ -312,19 +309,4 @@ const EventHandler = {
...
@@ -312,19 +309,4 @@ const EventHandler = {
}
}
}
}
/* istanbul ignore next */
// focusin and focusout polyfill
if
(
Polyfill
.
focusIn
)
{
(()
=>
{
function
listenerFocus
(
event
)
{
EventHandler
.
trigger
(
event
.
target
,
'
focusin
'
)
}
function
listenerBlur
(
event
)
{
EventHandler
.
trigger
(
event
.
target
,
'
focusout
'
)
}
EventHandler
.
on
(
document
,
'
focus
'
,
'
input
'
,
listenerFocus
)
EventHandler
.
on
(
document
,
'
blur
'
,
'
input
'
,
listenerBlur
)
})()
}
export
default
EventHandler
export
default
EventHandler
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Snippets