bind addEventListener, removeEventListener, and dispatchEvent for browsers that support EventTarget #106
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
In supporting browsers (Chrome, Safari, Edge, Firefox), third-party script loaded in an IFRAME that wraps
EventTarget.prototype.addEventListener
will lose track of the context ofthis
, and will incorrectly bind the handler to its own IFRAME (instead oftop
).Reproducible Case
To reproduce the issue, go here with the console open.
Without the fix, you will only see only 2 handlers fire:
To see the fix in action, go here.
You will see:
Why this happens
in
history.js
:in an IFRAME:
developer code in
top
:Because
history.js
basically unbinds thewindow.addEventListener
method,this
passed to the_addEventListener.apply
call will be the inner IFRAME (should be=== top
), and theload
listener will be bound to the wrongwindow
.