UNPKG

3.9 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.removeEventListener = exports.addEventListener = exports.off = exports.on = undefined;
7
8var _platform = require("./platform");
9
10var _utils = require("./utils");
11
12/* eslint no-param-reassign: 0 */
13
14var requestAnimationFrame = _platform.isServer ? _utils.noop : _platform.window.requestAnimationFrame || _platform.window.mozRequestAnimationFrame || _platform.window.webkitRequestAnimationFrame || function (fn) {
15 _platform.window.setTimeout(fn, 20);
16};
17
18var cancelAnimationFrame = _platform.isServer ? _utils.noop : _platform.window.cancelAnimationFrame || _platform.window.mozCancelAnimationFrame || _platform.window.webkitCancelAnimationFrame || _platform.window.clearTimeout;
19
20var isIE = _platform.isServer ? false : navigator.userAgent.match(/Trident/);
21
22var namespace = "__resizeDetector__";
23
24var uninitialize = function uninitialize(el) {
25 el[namespace].destroy();
26 el[namespace] = undefined;
27};
28
29var createElementHack = function createElementHack() {
30 var el = document.createElement("object");
31 el.className = "resize-sensor";
32 el.setAttribute("style", "display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1;");
33 el.setAttribute("class", "resize-sensor");
34 el.type = "text/html";
35 el.data = "about:blank";
36 return el;
37};
38
39var initialize = function initialize(el) {
40
41 var detector = el[namespace] = {};
42 detector.listeners = [];
43
44 var onResize = function onResize(e) {
45 /* Keep in mind e.target could be el OR objEl. In this current implementation we don't seem to need to know this but its important
46 to not forget e.g. in some future refactoring scenario. */
47 if (detector.resizeRAF) cancelAnimationFrame(detector.resizeRAF);
48 detector.resizeRAF = requestAnimationFrame(function () {
49 detector.listeners.forEach(function (fn) {
50 fn(e);
51 });
52 });
53 };
54
55 if (isIE) {
56 /* We do not support ie8 and below (or ie9 in compat mode).
57 Therefore there is no presence of `attachEvent` here. */
58 el.addEventListener("onresize", onResize);
59 detector.destroy = function () {
60 el.removeEventListener("onresize", onResize);
61 };
62 } else {
63 if (getComputedStyle(el).position === "static") {
64 detector.elWasStaticPosition = true;
65 el.style.position = "relative";
66 }
67 var objEl = createElementHack();
68 objEl.onload = function () /* event */{
69 this.contentDocument.defaultView.addEventListener("resize", onResize);
70 };
71 detector.destroy = function () {
72 if (detector.elWasStaticPosition) el.style.position = "";
73 // Event handlers will be automatically removed.
74 // http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
75 el.removeChild(objEl);
76 };
77
78 el.appendChild(objEl);
79 }
80};
81
82var on = function on(el, fn) {
83
84 /* Window object natively publishes resize events. We handle it as a
85 special case here so that users do not have to think about two APIs. */
86
87 if (el === _platform.window) {
88 _platform.window.addEventListener("resize", fn);
89 return;
90 }
91
92 /* Not caching namespace read here beacuse not guaranteed that its available. */
93
94 if (!el[namespace]) initialize(el);
95 el[namespace].listeners.push(fn);
96};
97
98var off = function off(el, fn) {
99 if (el === _platform.window) {
100 _platform.window.removeEventListener("resize", fn);
101 return;
102 }
103 var detector = el[namespace];
104 if (!detector) return;
105 var i = detector.listeners.indexOf(fn);
106 if (i !== -1) detector.listeners.splice(i, 1);
107 if (!detector.listeners.length) uninitialize(el);
108};
109
110exports.default = {
111 on: on,
112 off: off,
113 addEventListener: on,
114 removeEventListener: off
115};
116exports.on = on;
117exports.off = off;
118exports.addEventListener = on;
119exports.removeEventListener = off;
\No newline at end of file