intersection-observer 0.5.1 → 0.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -8
- package/intersection-observer-test.html +7 -0
- package/intersection-observer-test.js +2255 -4
- package/intersection-observer.js +363 -75
- package/package.json +8 -8
- package/border-test.html +0 -47
- package/frame1.html +0 -9
- package/frame2.html +0 -9
- package/frames.html +0 -33
- package/slot.html +0 -93
package/README.md
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
**⚠️ This polyfill was originally hosted in the [IntersectionObserver spec](https://github.com/w3c/IntersectionObserver) repo. Refer to that repo for commit history.**
|
2
|
+
|
1
3
|
# `IntersectionObserver` polyfill
|
2
4
|
|
3
5
|
This library polyfills the native [`IntersectionObserver`](http://w3c.github.io/IntersectionObserver/) API in unsupporting browsers. See the [API documentation](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) for usage information.
|
4
6
|
|
5
7
|
- [Installation](#installation)
|
6
8
|
- [Configuring the polyfill](#configuring-the-polyfill)
|
9
|
+
- [Limitations](#limitations)
|
7
10
|
- [Browser support](#browser-support)
|
8
11
|
- [Running the tests](#running-the-tests)
|
9
12
|
|
@@ -60,16 +63,16 @@ There are, however, additional use cases that the default configuration will not
|
|
60
63
|
|
61
64
|
If you need to handle any of these use-cases, you can configure the polyfill to poll the document by setting the `POLL_INTERVAL` property. This can be set either globally or on a per-instance basis.
|
62
65
|
|
63
|
-
**Enabling polling for all
|
66
|
+
**Enabling polling for all instances:**
|
64
67
|
|
65
|
-
To enable polling for all
|
68
|
+
To enable polling for all instances, set a value for `POLL_INTERVAL` on the `IntersectionObserver` prototype:
|
66
69
|
|
67
70
|
|
68
71
|
```js
|
69
72
|
IntersectionObserver.prototype.POLL_INTERVAL = 100; // Time in milliseconds.
|
70
73
|
```
|
71
74
|
|
72
|
-
**Enabling polling for individual
|
75
|
+
**Enabling polling for individual instances:**
|
73
76
|
|
74
77
|
To enable polling on only specific instances, set a `POLL_INTERVAL` value on the instance itself:
|
75
78
|
|
@@ -93,19 +96,84 @@ var io = new IntersectionObserver(callback);
|
|
93
96
|
io.USE_MUTATION_OBSERVER = false;
|
94
97
|
```
|
95
98
|
|
96
|
-
This is recommended in cases where the DOM will update frequently but you know those updates will have no
|
99
|
+
This is recommended in cases where the DOM will update frequently but you know those updates will have no effect on the position or your target elements.
|
100
|
+
|
101
|
+
|
102
|
+
## iframe support
|
103
|
+
|
104
|
+
### Same-origin iframes
|
105
|
+
|
106
|
+
Same-origin iframes are supported by the polyfill out of the box.
|
107
|
+
|
108
|
+
|
109
|
+
### Cross-origin iframes
|
110
|
+
|
111
|
+
Additional code and configuration are required to support cross-origin iframes,
|
112
|
+
both on the iframe and host sides.
|
113
|
+
|
114
|
+
The setup is as following:
|
115
|
+
|
116
|
+
1. The host and iframe will establish a messaging channel.
|
117
|
+
2. The host will setup its own IntersectionObserver instance for the
|
118
|
+
cross-origin iframe element. It can either use the this polyfill or any other
|
119
|
+
approach. For each IntersectionObserverEntry for the iframe it will forward
|
120
|
+
intersection data to the iframe via messaging.
|
121
|
+
3. The iframe will load the polyfill and configure it by calling the
|
122
|
+
`_setupCrossOriginUpdater()` method. It will call the provided callback
|
123
|
+
whenever it receives the intersection data from the the parent via messaging.
|
124
|
+
|
125
|
+
A hypothetical host code:
|
126
|
+
|
127
|
+
```javascript
|
128
|
+
function forwardIntersectionToIframe(iframe) {
|
129
|
+
createMessagingChannel(iframe, function(port) {
|
130
|
+
var io = new IntersectionObserver(function() {
|
131
|
+
port.postMessage({
|
132
|
+
boundingClientRect: serialize(boundingClientRect),
|
133
|
+
intersectionRect: serialize(intersectionRect)
|
134
|
+
});
|
135
|
+
}, {threshold: [0, 0.1, ..., 1]});
|
136
|
+
io.observe(iframe);
|
137
|
+
});
|
138
|
+
}
|
139
|
+
```
|
140
|
+
|
141
|
+
Notice that the host should provide a `threshold` argument for the desired
|
142
|
+
level of precision. Otherwise, the iframe side may not update as frequently as
|
143
|
+
desired.
|
144
|
+
|
145
|
+
A hypothetical iframe code:
|
146
|
+
|
147
|
+
```javascript
|
148
|
+
createMessagingChannel(parent, function(port) {
|
149
|
+
if (IntersectionObserver._setupCrossOriginUpdater) {
|
150
|
+
var crossOriginUpdater = IntersectionObserver._setupCrossOriginUpdater();
|
151
|
+
port.onmessage = function(event) {
|
152
|
+
crossOriginUpdater(
|
153
|
+
deserialize(event.data.boundingClientRect),
|
154
|
+
deserialize(event.data.intersectionRect)
|
155
|
+
);
|
156
|
+
};
|
157
|
+
}
|
158
|
+
});
|
159
|
+
```
|
160
|
+
|
161
|
+
|
162
|
+
## Limitations
|
163
|
+
|
164
|
+
This polyfill does not support the [proposed v2 additions](https://github.com/szager-chromium/IntersectionObserver/blob/v2/explainer.md), as these features are not currently possible to do with JavaScript and existing web APIs.
|
97
165
|
|
98
166
|
## Browser support
|
99
167
|
|
100
168
|
The polyfill has been tested and known to work in the latest version of all browsers.
|
101
169
|
|
102
|
-
Legacy support is also possible in very old browsers by including a shim for ES5 as well as the `window.getComputedStyle` method. The easiest way to load the IntersectionObserver polyfill and have it work in the widest range of browsers is via [polyfill.io](https://cdn.polyfill.io/
|
170
|
+
Legacy support is also possible in very old browsers by including a shim for ES5 as well as the `window.getComputedStyle` method. The easiest way to load the IntersectionObserver polyfill and have it work in the widest range of browsers is via [polyfill.io](https://cdn.polyfill.io/v3/), which will automatically include dependencies where necessary:
|
103
171
|
|
104
172
|
```html
|
105
|
-
<script src="https://polyfill.io/
|
173
|
+
<script src="https://polyfill.io/v3/polyfill.min.js?features=IntersectionObserver"></script>
|
106
174
|
```
|
107
175
|
|
108
|
-
With these polyfills, `IntersectionObserver` has been tested
|
176
|
+
With these polyfills, `IntersectionObserver` has been tested and known to work in the following browsers:
|
109
177
|
|
110
178
|
<table>
|
111
179
|
<tr>
|
@@ -144,4 +212,4 @@ With these polyfills, `IntersectionObserver` has been tested an known to work in
|
|
144
212
|
|
145
213
|
To run the test suite for the `IntersectionObserver` polyfill, open the [`intersection-observer-test.html`](./intersection-observer-test.html) page in the browser of your choice.
|
146
214
|
|
147
|
-
If you run the tests in a browser that
|
215
|
+
If you run the tests in a browser that supports `IntersectionObserver` natively, the tests will be run against the native implementation. If it doesn't, the tests will be run against the polyfill.
|
@@ -27,6 +27,13 @@ Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.
|
|
27
27
|
<!-- Setup -->
|
28
28
|
<script>mocha.setup({ui:'bdd'});</script>
|
29
29
|
|
30
|
+
<!-- Uncomment this script to force the polyfill installation
|
31
|
+
<script>
|
32
|
+
delete window.IntersectionObserver;
|
33
|
+
delete window.IntersectionObserverEntry;
|
34
|
+
</script>
|
35
|
+
-->
|
36
|
+
|
30
37
|
<!-- Script under test -->
|
31
38
|
<script src="intersection-observer.js"></script>
|
32
39
|
|