From 05c98b5f271a35555f2b288313c52e745ed7c693 Mon Sep 17 00:00:00 2001
From: Darren Scerri
Date: Wed, 8 Feb 2017 13:41:19 +0100
Subject: [PATCH 01/57] Fix small typo and comment style consistency (#149)
---
src/ResizeSensor.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index f027998..376cb5c 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -14,11 +14,11 @@
}
}(this, function () {
- //Make sure it does not throw in a SSR (Server Side Rendering) situation
+ // Make sure it does not throw in a SSR (Server Side Rendering) situation
if (typeof window === "undefined") {
return null;
}
- // Only used for the dirty checking, so the event callback count is limted to max 1 call per fps per sensor.
+ // Only used for the dirty checking, so the event callback count is limited to max 1 call per fps per sensor.
// In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and
// would generate too many unnecessary events.
var requestAnimationFrame = window.requestAnimationFrame ||
From c444bc400e75256c334522d98cf70863c160218a Mon Sep 17 00:00:00 2001
From: Kyle
Date: Wed, 8 Feb 2017 13:42:09 +0100
Subject: [PATCH 02/57] Simplify else statements (#147)
---
src/ResizeSensor.js | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 376cb5c..7dd2dce 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -100,11 +100,12 @@
function getComputedStyle(element, prop) {
if (element.currentStyle) {
return element.currentStyle[prop];
- } else if (window.getComputedStyle) {
+ }
+ if (window.getComputedStyle) {
return window.getComputedStyle(element, null).getPropertyValue(prop);
- } else {
- return element.style[prop];
}
+
+ return element.style[prop];
}
/**
@@ -113,14 +114,14 @@
* @param {Function} resized
*/
function attachResizeEvent(element, resized) {
- if (!element.resizedAttached) {
- element.resizedAttached = new EventQueue();
- element.resizedAttached.add(resized);
- } else if (element.resizedAttached) {
+ if (element.resizedAttached) {
element.resizedAttached.add(resized);
return;
}
+ element.resizedAttached = new EventQueue();
+ element.resizedAttached.add(resized);
+
element.resizeSensor = document.createElement('div');
element.resizeSensor.className = 'resize-sensor';
var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';
From 134443d31c10ef8c0b475b892c2ecc4f75334dc5 Mon Sep 17 00:00:00 2001
From: "Joseph J. Schmitt"
Date: Thu, 6 Apr 2017 04:18:45 -0400
Subject: [PATCH 03/57] Fix ElementQueries always attaching to window and
listening (#162)
When we originally added UMD support, we forgot to move the logic that forcibly calls .listen() out of the block at the bottom and into the UMD logic block. This, in turn, meant that EQ was always being attached to window and listen was always being called, even when using EQ or ResizeSensor in a front-end environment with module support.
---
src/ElementQueries.js | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index b71d6c9..14f1232 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -11,6 +11,7 @@
module.exports = factory(require('./ResizeSensor.js'));
} else {
root.ElementQueries = factory(root.ResizeSensor);
+ root.ElementQueries.listen();
}
}(this, function (ResizeSensor) {
@@ -501,15 +502,6 @@
domLoaded(ElementQueries.init);
};
- // make available to common module loader
- if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
- module.exports = ElementQueries;
- }
- else {
- window.ElementQueries = ElementQueries;
- ElementQueries.listen();
- }
-
return ElementQueries;
}));
From ed6a88c5681079b431e1e3bc2de6382020837bda Mon Sep 17 00:00:00 2001
From: Philippe Vachon-Rivard
Date: Thu, 4 May 2017 14:10:06 -0400
Subject: [PATCH 04/57] Fixed bug that prevented detach from being called on
instance, even when withTracking was set to true. (#169)
---
src/ElementQueries.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 14f1232..0175e15 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -415,7 +415,7 @@
};
this.detach = function() {
- if (!this.withTracking) {
+ if (!trackingActive) {
throw 'withTracking is not enabled. We can not detach elements since we don not store it.' +
'Use ElementQueries.withTracking = true; before domready or call ElementQueryes.update(true).';
}
From a90832ef68b7415aa85d747e4d679c9e6bdaa668 Mon Sep 17 00:00:00 2001
From: Chakrit Likitkhajorn
Date: Fri, 5 May 2017 01:10:41 +0700
Subject: [PATCH 05/57] Fix element sometimes already unmounted using with
react (#168)
---
src/ResizeSensor.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 7dd2dce..3b2e896 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -114,6 +114,7 @@
* @param {Function} resized
*/
function attachResizeEvent(element, resized) {
+ if (!element) return;
if (element.resizedAttached) {
element.resizedAttached.add(resized);
return;
@@ -209,6 +210,7 @@
ResizeSensor.detach = function(element, ev) {
forEachElement(element, function(elem){
+ if (!elem) return
if(elem.resizedAttached && typeof ev == "function"){
elem.resizedAttached.remove(ev);
if(elem.resizedAttached.length()) return;
From 85122fe77f91627e4873d45686a1bb2ecb669bfe Mon Sep 17 00:00:00 2001
From: Franck Freiburger
Date: Fri, 9 Jun 2017 18:56:37 +0200
Subject: [PATCH 06/57] ResizeSensor.js optimization (#172)
The aim of `getComputedStyle(element, 'position') == 'static'` is to detect that `element` is not "positioned".
[`HTMLElement.offsetParent`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent) returns the nearest positioned element in the containment hierarchy.
`element.resizeSensor.offsetParent !== element` mean that `element` is not positioned.
Right ?
---
src/ResizeSensor.js | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 3b2e896..acc0138 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -92,22 +92,6 @@
}
}
- /**
- * @param {HTMLElement} element
- * @param {String} prop
- * @returns {String|Number}
- */
- function getComputedStyle(element, prop) {
- if (element.currentStyle) {
- return element.currentStyle[prop];
- }
- if (window.getComputedStyle) {
- return window.getComputedStyle(element, null).getPropertyValue(prop);
- }
-
- return element.style[prop];
- }
-
/**
*
* @param {HTMLElement} element
@@ -138,7 +122,7 @@
'';
element.appendChild(element.resizeSensor);
- if (getComputedStyle(element, 'position') == 'static') {
+ if (element.resizeSensor.offsetParent !== element) {
element.style.position = 'relative';
}
From ae2b61038bdaf6f46d81a9850f784f82c25ff416 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Bendykowski?=
Date: Fri, 21 Jul 2017 23:46:03 +0200
Subject: [PATCH 07/57] Add ResizeSensor typing for TypeScript (#179)
---
src/ResizeSensor.d.ts | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 src/ResizeSensor.d.ts
diff --git a/src/ResizeSensor.d.ts b/src/ResizeSensor.d.ts
new file mode 100644
index 0000000..8599850
--- /dev/null
+++ b/src/ResizeSensor.d.ts
@@ -0,0 +1,5 @@
+declare class ResizeSensor {
+ constructor(element: (Element | Element[]), callback: Function);
+}
+
+export = ResizeSensor;
From bc77870c8214a716e8061fede683a0e54d8fc48a Mon Sep 17 00:00:00 2001
From: Noel Rivas
Date: Fri, 21 Jul 2017 16:46:52 -0500
Subject: [PATCH 08/57] Include imported styleSheets in rule extraction. (#176)
---
src/ElementQueries.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 0175e15..1e77ed2 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -367,6 +367,8 @@
}
} else if (4 === rules[i].type) {
readRules(rules[i].cssRules || rules[i].rules);
+ } else if (3 === rules[i].type) {
+ readRules(rules[i].styleSheet.cssRules);
}
}
}
From 4d6469bed74f1e3979dd395c050dd5c4e95cb572 Mon Sep 17 00:00:00 2001
From: newlukai
Date: Fri, 21 Jul 2017 23:56:55 +0200
Subject: [PATCH 09/57] Use 'window' if available as 'root' in exporting (#151)
---
src/ElementQueries.js | 2 +-
src/ResizeSensor.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 1e77ed2..a3ba4bd 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -13,7 +13,7 @@
root.ElementQueries = factory(root.ResizeSensor);
root.ElementQueries.listen();
}
-}(this, function (ResizeSensor) {
+}(typeof window !== 'undefined' ? window : this, function (ResizeSensor) {
/**
*
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index acc0138..66dbf4a 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -12,7 +12,7 @@
} else {
root.ResizeSensor = factory();
}
-}(this, function () {
+}(typeof window !== 'undefined' ? window : this, function () {
// Make sure it does not throw in a SSR (Server Side Rendering) situation
if (typeof window === "undefined") {
From adefff41c47aea79e73cd485ccd7d64ff9bbfc53 Mon Sep 17 00:00:00 2001
From: Nikita
Date: Fri, 18 Aug 2017 19:35:03 +0300
Subject: [PATCH 10/57] Fix error with local variables (#167)
---
src/ElementQueries.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index a3ba4bd..ab121cb 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -330,8 +330,8 @@
* @param {String} css
*/
function extractQuery(css) {
- var match;
- var smatch;
+ var match, smatch, attrs, attrMatch;
+
css = css.replace(/'/g, '"');
while (null !== (match = regex.exec(css))) {
smatch = match[1] + match[3];
From 100d74f2400e1a1f5dc25d74155dc9483ebfba8e Mon Sep 17 00:00:00 2001
From: kaljak
Date: Tue, 14 Nov 2017 13:45:54 +0100
Subject: [PATCH 11/57] - fixed #95 (#198)
---
src/ElementQueries.js | 23 ++++++++++++++++++-----
1 file changed, 18 insertions(+), 5 deletions(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index ab121cb..7fa172e 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -180,9 +180,9 @@
else allQueries[mode][property][value] += ','+selector;
}
- function getQuery() {
+ function getQuery(container) {
var query;
- if (document.querySelectorAll) query = document.querySelectorAll.bind(document);
+ if (document.querySelectorAll) query = (container) ? container.querySelectorAll.bind(container) : document.querySelectorAll.bind(document);
if (!query && 'undefined' !== typeof $$) query = $$;
if (!query && 'undefined' !== typeof jQuery) query = jQuery;
@@ -196,14 +196,14 @@
/**
* Start the magic. Go through all collected rules (readRules()) and attach the resize-listener.
*/
- function findElementQueriesElements() {
- var query = getQuery();
+ function findElementQueriesElements(container) {
+ var query = getQuery(container);
for (var mode in allQueries) if (allQueries.hasOwnProperty(mode)) {
for (var property in allQueries[mode]) if (allQueries[mode].hasOwnProperty(property)) {
for (var value in allQueries[mode][property]) if (allQueries[mode][property].hasOwnProperty(value)) {
- var elements = query(allQueries[mode][property][value]);
+ var elements = query(allQueries[mode][property][value], container);
for (var i = 0, j = elements.length; i < j; i++) {
setupElement(elements[i], {
mode: mode,
@@ -407,6 +407,15 @@
findResponsiveImages();
};
+ /**
+ * Go through all collected rules (readRules()) and attach the resize-listener.
+ *
+ * @param {HTMLElement} container only elements of the container are considered (document.body if not set)
+ */
+ this.findElementQueriesElements = function(container) {
+ findElementQueriesElements(container);
+ };
+
/**
*
* @param {Boolean} withTracking allows and requires you to use detach, since we store internally all used elements
@@ -500,6 +509,10 @@
else window.onload = callback;
};
+ ElementQueries.findElementQueriesElements = function(container) {
+ ElementQueries.instance.findElementQueriesElements(container);
+ };
+
ElementQueries.listen = function() {
domLoaded(ElementQueries.init);
};
From 004784e0d196f5d356981dba33b5fdff9e80a802 Mon Sep 17 00:00:00 2001
From: Alex Bennett
Date: Tue, 14 Nov 2017 12:46:20 +0000
Subject: [PATCH 12/57] Adding error check for InvalidAccessError (#197)
This only happens with Firefox due to their security policy.
Fix found in previous issue thread. https://github.com/marcj/css-element-queries/issues/117
Can confirm this was due to typekit being included in the project.
It was quite annoying to debug in a build environment via es6 module loader (systemJS) so hopefully, this PR solves the issue for people.
All credit to @jyrkij
---
src/ElementQueries.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 7fa172e..dd53af4 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -389,7 +389,7 @@
try {
readRules(document.styleSheets[i].cssRules || document.styleSheets[i].rules || document.styleSheets[i].cssText);
} catch(e) {
- if (e.name !== 'SecurityError') {
+ if (e.name !== 'SecurityError' && e.name !== 'InvalidAccessError') {
throw e;
}
}
From d73bb3db5ab31749cadf250797537e1cd24b7fe5 Mon Sep 17 00:00:00 2001
From: James Adams
Date: Tue, 14 Nov 2017 23:46:36 +1100
Subject: [PATCH 13/57] Add detach to TS type def (#194)
* feat(typescript type defs): add detach
* refactor(semicolon)
---
src/ResizeSensor.d.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/ResizeSensor.d.ts b/src/ResizeSensor.d.ts
index 8599850..fe5bb03 100644
--- a/src/ResizeSensor.d.ts
+++ b/src/ResizeSensor.d.ts
@@ -1,5 +1,6 @@
declare class ResizeSensor {
constructor(element: (Element | Element[]), callback: Function);
+ detach(callback: Function): void;
}
export = ResizeSensor;
From 9801bb0a731b8694282e9fb350194b975b8dfac3 Mon Sep 17 00:00:00 2001
From: Christian Memije
Date: Fri, 22 Dec 2017 06:09:12 -0800
Subject: [PATCH 14/57] Set direction as ltr (#201)
---
src/ResizeSensor.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 66dbf4a..282ef0c 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -108,6 +108,7 @@
element.resizedAttached.add(resized);
element.resizeSensor = document.createElement('div');
+ element.resizeSensor.dir = 'ltr';
element.resizeSensor.className = 'resize-sensor';
var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';
var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';
From bc8541c4fd0c89e979c04a693283864e4a6c6388 Mon Sep 17 00:00:00 2001
From: Alexis
Date: Fri, 22 Dec 2017 15:09:43 +0100
Subject: [PATCH 15/57] Fix require in documentation README.md (#200)
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 833190c..7f50958 100644
--- a/README.md
+++ b/README.md
@@ -88,15 +88,15 @@ Here live http://marcj.github.io/css-element-queries/.
If you're using a module loader you need to trigger the event listening or initialization yourself:
```javascript
-var EQ = require('node_modules/css-element-queries/ElementQueries');
+var ElementQueries = require('css-element-queries/src/ElementQueries');
//attaches to DOMLoadContent
-EQ.listen();
+ElementQueries.listen();
//or if you want to trigger it yourself.
// Parse all available CSS and attach ResizeSensor to those elements which have rules attached
// (make sure this is called after 'load' event, because CSS files are not ready when domReady is fired.
-EQ.init();
+ElementQueries.init();
```
## Issues
From fdb851e910a44e9167b58987a539430302ace71d Mon Sep 17 00:00:00 2001
From: lxjwlt
Date: Fri, 22 Dec 2017 22:11:01 +0800
Subject: [PATCH 16/57] fix: sensor not working when element's width or height
is 0 (#203)
---
src/ResizeSensor.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 282ef0c..fbdfb98 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -110,7 +110,7 @@
element.resizeSensor = document.createElement('div');
element.resizeSensor.dir = 'ltr';
element.resizeSensor.className = 'resize-sensor';
- var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';
+ var style = 'position: absolute; left: -10px; top: -10px; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';
var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';
element.resizeSensor.style.cssText = style;
From 072a3fc71c029f9a99dca469e272602982e6786c Mon Sep 17 00:00:00 2001
From: Pulyaev Yuriy
Date: Fri, 22 Dec 2017 16:14:40 +0200
Subject: [PATCH 17/57] Fix subpixel sizes support (#204)
---
src/ElementQueries.js | 27 +++++++++++++++++++++++----
src/ResizeSensor.js | 32 +++++++++++++++++++++++++++-----
2 files changed, 50 insertions(+), 9 deletions(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index dd53af4..b6e86d0 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -38,6 +38,26 @@
return parseFloat(fontSize) || 16;
}
+ /**
+ * Get element size
+ * @param {HTMLElement} element
+ * @returns {Object} {width, height}
+ */
+ function getElementSize(element) {
+ if (!element.getBoundingClientRect) {
+ return {
+ width: element.offsetWidth,
+ height: element.offsetHeight
+ }
+ }
+
+ var rect = element.getBoundingClientRect();
+ return {
+ width: Math.round(rect.width),
+ height: Math.round(rect.height)
+ }
+ }
+
/**
*
* @copyright https://github.com/Mr0grog/element-query/blob/master/LICENSE
@@ -85,7 +105,7 @@
function SetupInformation(element) {
this.element = element;
this.options = {};
- var key, option, width = 0, height = 0, value, actualValue, attrValues, attrValue, attrName;
+ var key, option, elementSize, value, actualValue, attrValues, attrValue, attrName;
/**
* @param {Object} option {mode: 'min|max', property: 'width|height', value: '123px'}
@@ -102,8 +122,7 @@
*/
this.call = function() {
// extract current dimensions
- width = this.element.offsetWidth;
- height = this.element.offsetHeight;
+ elementSize = getElementSize(this.element);
attrValues = {};
@@ -115,7 +134,7 @@
value = convertToPx(this.element, option.value);
- actualValue = option.property == 'width' ? width : height;
+ actualValue = option.property == 'width' ? elementSize.width : elementSize.height;
attrName = option.mode + '-' + option.property;
attrValue = '';
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index fbdfb98..f0a6182 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -53,6 +53,26 @@
}
}
+ /**
+ * Get element size
+ * @param {HTMLElement} element
+ * @returns {Object} {width, height}
+ */
+ function getElementSize(element) {
+ if (!element.getBoundingClientRect) {
+ return {
+ width: element.offsetWidth,
+ height: element.offsetHeight
+ }
+ }
+
+ var rect = element.getBoundingClientRect();
+ return {
+ width: Math.round(rect.width),
+ height: Math.round(rect.height)
+ }
+ }
+
/**
* Class for dimension change detection.
*
@@ -131,8 +151,9 @@
var expandChild = expand.childNodes[0];
var shrink = element.resizeSensor.childNodes[1];
var dirty, rafId, newWidth, newHeight;
- var lastWidth = element.offsetWidth;
- var lastHeight = element.offsetHeight;
+ var size = getElementSize(element);
+ var lastWidth = size.width;
+ var lastHeight = size.height;
var reset = function() {
expandChild.style.width = '100000px';
@@ -161,8 +182,9 @@
};
var onScroll = function() {
- newWidth = element.offsetWidth;
- newHeight = element.offsetHeight;
+ var size = getElementSize(element);
+ var newWidth = size.width;
+ var newHeight = size.height;
dirty = newWidth != lastWidth || newHeight != lastHeight;
if (dirty && !rafId) {
@@ -195,7 +217,7 @@
ResizeSensor.detach = function(element, ev) {
forEachElement(element, function(elem){
- if (!elem) return
+ if (!elem) return;
if(elem.resizedAttached && typeof ev == "function"){
elem.resizedAttached.remove(ev);
if(elem.resizedAttached.length()) return;
From 2f6959de9c76dcd562ef8539dd40172ea76c1c2d Mon Sep 17 00:00:00 2001
From: JeanRemiDelteil
Date: Fri, 5 Jan 2018 19:53:47 +0100
Subject: [PATCH 18/57] Fix ResizeSensor to fire when used in a CustomElement
(#206)
Calling Reset() just after initialization does not fire the 'scroll' events.
Instead, call it in the next frame. This also works with native elements and simple DOM.
---
src/ResizeSensor.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index f0a6182..45692fa 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -166,8 +166,6 @@
shrink.scrollTop = 100000;
};
- reset();
-
var onResized = function() {
rafId = 0;
@@ -204,6 +202,9 @@
addEvent(expand, 'scroll', onScroll);
addEvent(shrink, 'scroll', onScroll);
+
+ // Fix for custom Elements
+ requestAnimationFrame(reset);
}
forEachElement(element, function(elem){
From df0ce5c7a131ff11f8cfdc5996973a4029d162d0 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 9 Jan 2018 01:16:18 +0100
Subject: [PATCH 19/57] Added dynamic tracking of newly created elements
(supporting angular&co).
Removed element tracking.
Dropped IE9 and lower support.
Fixed sensor bug with invisible elements.
Addet reset() method to ResizeSensor.
---
README.md | 8 +-
src/ElementQueries.js | 265 +++++++++++++-------------
src/ResizeSensor.js | 33 +++-
tests/demo.css | 425 ++++++++++++++++++++++++++++++++++++++++++
tests/demo.html | 396 +++++++++++++++++++++++++++++++++++++++
tests/demo.js | 135 ++++++++++++++
6 files changed, 1116 insertions(+), 146 deletions(-)
create mode 100644 tests/demo.css
create mode 100644 tests/demo.html
create mode 100644 tests/demo.js
diff --git a/README.md b/README.md
index 7f50958..61c88f5 100644
--- a/README.md
+++ b/README.md
@@ -13,9 +13,10 @@ Features:
- no performance issues since it listens only on size changes of elements that have element query rules defined through css. Other element query polifills only listen on `window.onresize` which causes performance issues and allows only to detect changes via window.resize event and not inside layout changes like css3 animation, :hover, DOM changes etc.
- no interval/timeout detection. Truly event-based through integrated ResizeSensor class.
+ - automatically discovers new DOM elements. No need to call javascript manually.
- no CSS modifications. Valid CSS Syntax
- - all CSS selectors available. Uses regular attribute selector. No need to write rules in HTML.
- - supports and tested in webkit, gecko and IE(7/8/9/10/11)
+ - all CSS selectors available. Uses regular attribute selector. No need to write rules in HTML/JS.
+ - supports and tested in webkit, gecko and IE(10+)
- `min-width`, `min-height`, `max-width` and `max-height` are supported so far
- works with any layout modifications: HTML (innerHTML etc), inline styles, DOM mutation, CSS3 transitions, fluid layout changes (also percent changes), pseudo classes (:hover etc.), window resizes and more
- no Javascript-Framework dependency (works with jQuery, Mootools, etc.)
@@ -50,7 +51,7 @@ More demos and information: http://marcj.github.io/css-element-queries/
As you can see we use the `~=` [attribute selector](https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors).
Since this css-element-queries polyfill adds new element attributes on the DOM element
-(``) depending on your actual CSS,
+(``) depending on your actual CSS and element's dimension,
you should always use this attribute selector (especially if you have several element query rules on the same element).
```html
@@ -104,6 +105,7 @@ ElementQueries.init();
- So far does not work on `img` and other elements that can't contain other elements. Wrapping with a `div` works fine though (See demo).
- Adds additional hidden elements into selected target element and forces target element to be relative or absolute.
- Local stylesheets do not work (using `file://` protocol).
+ - If you have rules on an element that has a css animation, also add `element-queries`. E.g. `.widget-name { animation: 2sec my-animation, 1s element-queries;}`. We use this to detect new added DOM elements automatically.
## License
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index b6e86d0..2bd723c 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -1,9 +1,10 @@
+'use strict';
+
/**
* Copyright Marc J. Schmidt. See the LICENSE file at the top-level
* directory of this distribution and at
* https://github.com/marcj/css-element-queries/blob/master/LICENSE.
*/
-;
(function (root, factory) {
if (typeof define === "function" && define.amd) {
define(['./ResizeSensor.js'], factory);
@@ -20,10 +21,15 @@
* @type {Function}
* @constructor
*/
- var ElementQueries = function() {
+ var ElementQueries = function () {
+ //
+
+
+
+
+
+
+
+
Examples
+
+ Drag the gray line at the right to see it in action.
+
+
+
+
+
+
Responsive Text
+
+
+
+
Element responsiveness FTW!
+
+
+
Element started display: none
+
+
+
+
+
+
Element detachable
+
+
+
+
+
+
Dynamic element {{id}}
+
+
+
+
+
+
+
+
+
+
+
+
+
Responsive Image
+
+
+
+
+ The image above has a default of 700px. Shrink or expend the container too see responsive image
+ working.
+ Thanks
@placehold.it
+
+
+
+
+
+
+
Responsive Widget
+
+
+
Demo 1
+ This is content from the first responsive demo without media queries. It uses the element
+ queries
+ provided by this library.
+
+
+
+
+
+
+
+
+
+
+
+
Responsive Layout
+
+
+
Demo 2
+
+ Box
+
+
+ First 1/2 box
+
+
+ Second 1/2 box
+
+
+
+
+
+
+
+
+
+
+
+
Responsive Animation
+
+
+
Demo 3 - width
+
+
+
+ This box is animated through css transitions.
+ We attached a resize-listener to this box. See below.
+
+
+ No changes.
+
+
+
+
+
+
Demo 4 - height
+
+
+
+ This box is animated through css transitions.
+ We attached a resize-listener to this box. See below.
+
+
+ No changes.
+
+
+
+
+
+
+
ResizeSensor Demo
+
+
+ CSS-Element-Queries comes with a Javascript ResizeSensor class you can use in Javascript directly.
+
+
+
+
+
+
+
+
Performance Demo
+
+
+ Performance Test:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/demo.js b/tests/demo.js
new file mode 100644
index 0000000..e4899a1
--- /dev/null
+++ b/tests/demo.js
@@ -0,0 +1,135 @@
+$(document).ready(function () {
+ console.log('ready');
+
+ // $("textarea.html").each(function(idx, textarea) {
+ // CodeMirror.fromTextArea(textarea, {
+ // lineNumbers: true,
+ // mode: "htmlmixed",
+ // readOnly: true
+ // });
+ // });
+ //
+ // $("textarea.css").each(function(idx, textarea) {
+ // CodeMirror.fromTextArea(textarea, {
+ // lineNumbers: true,
+ // mode: "css",
+ // readOnly: true
+ // });
+ // });
+ //
+ // $("textarea.javascript").each(function(idx, textarea) {
+ // CodeMirror.fromTextArea(textarea, {
+ // lineNumbers: true,
+ // mode: "javascript",
+ // readOnly: true
+ // });
+ // });
+});
+
+function ResizerDemo(element) {
+ element = $(element);
+ var handler = $('');
+ var info = $('');
+
+ element.append(handler);
+ element.append(info);
+
+ var hammer = new Hammer(element[0], {recognizers: [
+ [Hammer.Pan, { threshold: 0}]
+ ]});
+
+ var startWidth;
+ element.on('mousedown', function(e){
+ e.preventDefault();
+ });
+ hammer.on('panstart', function(e) {
+ startWidth = element[0].clientWidth;
+ });
+
+ hammer.on('panmove', function(e) {
+ element[0].style.width = (startWidth + e.deltaX) + 'px';
+ info.html(element[0].clientWidth + 'px x ' + element[0].clientHeight + 'px');
+ })
+}
+
+$( document ).ready(function(){
+ $('.examplesResizerDemos').each(function(idx, element){
+ new ResizerDemo(element);
+ });
+
+ perfTest();
+ example3();
+ example4();
+ example5();
+});
+
+function perfTest(){
+ var container = $('#dynamicContainer');
+ var dynamicCount = $('#dynamicCount');
+ var dynamicCounter = $('#dynamicCounter');
+
+ window.detachDynamic = function() {
+ container.children().each(function(idx, element) {
+ ResizeSensor.detach(element);
+ });
+ };
+
+ window.removeDynamic = function() {
+ container.html('');
+ };
+
+ window.addDynamic = function() {
+ container.html('');
+ var i = 0, to = dynamicCount.val(), div, counter = 0;
+ for (; i < to; i++) {
+ div = $('#'+i+'
');
+ container.append(div);
+
+ new ResizeSensor(div, function(){
+ counter++;
+ dynamicCounter.html(counter + ' changes.');
+ });
+ }
+ }
+}
+
+function example3(){
+ var logger = $('#example-3-log');
+ var box = $('#example-3-box');
+
+ $('#startStop3').on('click', function(){
+ if (box.hasClass('example-3-box-start')) {
+ box.removeClass('example-3-box-start');
+ } else {
+ box.addClass('example-3-box-start');
+ }
+ });
+ new ResizeSensor(box, function(el){
+ logger.html('Changed to ' + box[0].clientWidth+'px width.');
+ });
+
+}
+
+function example4(){
+ var logger = $('#example-4-log');
+ var box = $('#example-4-box');
+
+ $('#startStop4').on('click', function(){
+ if (box.hasClass('example-4-box-start')) {
+ box.removeClass('example-4-box-start');
+ } else {
+ box.addClass('example-4-box-start');
+ }
+ });
+ new ResizeSensor(box, function(){
+ logger.html('Changed to ' + box[0].clientHeight+'px height.');
+ });
+}
+
+function example5(){
+ var box = $('#example-5');
+ var changed = 0;
+ new ResizeSensor(box.parent(), function(){
+ box[0].innerHTML = (++changed) + ' changes. ' + box.parent()[0].clientWidth+'px/'+box.parent()[0].clientHeight+'px';
+ });
+}
\ No newline at end of file
From 2d677ef1a6638583cc4de714b4721aec30d6ca9d Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 9 Jan 2018 01:43:04 +0100
Subject: [PATCH 20/57] npm release
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 4ae45dc..23be460 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "0.3.2",
+ "version": "1.0.0",
"description": "CSS-Element-Queries Polyfill. proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"directories": {
From 513f358e3e834348f3eac71f56d911752122c009 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 9 Jan 2018 15:23:28 +0100
Subject: [PATCH 21/57] Fixed typo in getting `position` of the element
---
src/ResizeSensor.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 2ee0d5f..0846014 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -144,7 +144,7 @@
'';
element.appendChild(element.resizeSensor);
- var position = window.getComputedStyle(element).getPropertyPriority('position');
+ var position = window.getComputedStyle(element).getPropertyValue('position');
if ('absolute' !== position && 'relative' !== position && 'fixed' !== position) {
element.style.position = 'relative';
}
From 3817e42adc444223c3a8d6240c667c51bfb9d4b0 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 9 Jan 2018 15:24:14 +0100
Subject: [PATCH 22/57] npm release
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 23be460..7b6a3d3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.0.0",
+ "version": "1.0.1",
"description": "CSS-Element-Queries Polyfill. proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"directories": {
From a1ec6e49e3bb3dc55c21327ccae18d0d204b56f2 Mon Sep 17 00:00:00 2001
From: Alexis
Date: Tue, 13 Feb 2018 13:42:53 +0100
Subject: [PATCH 23/57] Fix cross-domain cssRules access breaking code (#214)
When @import rule points to an other domain, accessing the style sheet with .cssRules will cause trouble on Chrome and Firefox (at least, haven't tested on other browsers). Firefox will raise a "Security error code: 1000" while Chrome will raise "Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules" which (I d'ont know why) can't be caught with a regular try catch statement and will break the for loop and thus not parse the other rules if any.
I had this problem while having a @import rule for google fonts. I fixed the issue by checking first if the property cssRules actually exist.
---
src/ElementQueries.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 2bd723c..0a46486 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -384,7 +384,9 @@
} else if (4 === rules[i].type) {
readRules(rules[i].cssRules || rules[i].rules);
} else if (3 === rules[i].type) {
- readRules(rules[i].styleSheet.cssRules);
+ if(rules[i].styleSheet.hasOwnProperty("cssRules")) {
+ readRules(rules[i].styleSheet.cssRules);
+ }
}
}
}
From 529c704eab273d095d5c5a9ea629d23217cfd9a8 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Fri, 23 Feb 2018 14:32:51 +0100
Subject: [PATCH 24/57] fixed typo in findElementQueriesElements
---
src/ElementQueries.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 0a46486..65dc3c3 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -224,7 +224,7 @@
function findElementQueriesElements(container) {
var query = getQuery(container);
- for (var selector in allQueries) if (allQueries.hasOwnProperty(mode)) {
+ for (var selector in allQueries) if (allQueries.hasOwnProperty(selector)) {
// find all elements based on the extract query selector from the element query rule
var elements = query(selector, container);
@@ -447,7 +447,6 @@
}
}
- // findElementQueriesElements();
findResponsiveImages();
};
From decc2b769a7d909c0727bfc0c793e1fd128cd813 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Fri, 23 Feb 2018 14:36:16 +0100
Subject: [PATCH 25/57] tag 1.0.2
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 7b6a3d3..28c459f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.0.1",
+ "version": "1.0.2",
"description": "CSS-Element-Queries Polyfill. proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"directories": {
From 0cd66f61eee3d01dd2ce29eb1bb201482e311221 Mon Sep 17 00:00:00 2001
From: movedoa
Date: Thu, 1 Mar 2018 17:33:07 +0100
Subject: [PATCH 26/57] Use ResizeObserver when available and check for initial
invisible elements (#213)
ResizeObserver is Chrome only at the moment.
When a resize sensor has been added to an invisible element, then we check coming with this commit every frame whether it is actually visible (rendered) and then start the sensor process. Otherwise the sensor would just not work on initial invisible elements.
---
src/ResizeSensor.js | 106 +++++++++++++++++++++++++++++++-------------
1 file changed, 75 insertions(+), 31 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 0846014..d03e17d 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -83,6 +83,9 @@
* @constructor
*/
var ResizeSensor = function(element, callback) {
+
+ var observer;
+
/**
*
* @constructor
@@ -94,9 +97,9 @@
};
var i, j;
- this.call = function() {
+ this.call = function(sizeInfo) {
for (i = 0, j = q.length; i < j; i++) {
- q[i].call();
+ q[i].call(this, sizeInfo);
}
};
@@ -152,32 +155,50 @@
var expand = element.resizeSensor.childNodes[0];
var expandChild = expand.childNodes[0];
var shrink = element.resizeSensor.childNodes[1];
- var dirty, rafId, newWidth, newHeight;
+
+ var dirty, rafId;
var size = getElementSize(element);
var lastWidth = size.width;
var lastHeight = size.height;
-
- var reset = function() {
- //set display to block, necessary otherwise hidden elements won't ever work
- var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;
-
- if (invisible) {
- var saveDisplay = element.style.display;
- element.style.display = 'block';
- }
-
+ var initialHiddenCheck = true, resetRAF_id;
+
+
+ var resetExpandShrink = function () {
expandChild.style.width = '100000px';
expandChild.style.height = '100000px';
-
+
expand.scrollLeft = 100000;
expand.scrollTop = 100000;
-
+
shrink.scrollLeft = 100000;
shrink.scrollTop = 100000;
+ };
- if (invisible) {
- element.style.display = saveDisplay;
+ var reset = function() {
+ // Check if element is hidden
+ if (initialHiddenCheck) {
+ if (!expand.scrollTop && !expand.scrollLeft) {
+
+ // reset
+ resetExpandShrink();
+
+ // Check in next frame
+ if (!resetRAF_id){
+ resetRAF_id = requestAnimationFrame(function(){
+ resetRAF_id = 0;
+
+ reset();
+ });
+ }
+
+ return;
+ } else {
+ // Stop checking
+ initialHiddenCheck = false;
+ }
}
+
+ resetExpandShrink();
};
element.resizeSensor.resetSensor = reset;
@@ -186,19 +207,17 @@
if (!dirty) return;
- lastWidth = newWidth;
- lastHeight = newHeight;
+ lastWidth = size.width;
+ lastHeight = size.height;
if (element.resizedAttached) {
- element.resizedAttached.call();
+ element.resizedAttached.call(size);
}
};
var onScroll = function() {
- var size = getElementSize(element);
- var newWidth = size.width;
- var newHeight = size.height;
- dirty = newWidth != lastWidth || newHeight != lastHeight;
+ size = getElementSize(element);
+ dirty = size.width !== lastWidth || size.height !== lastHeight;
if (dirty && !rafId) {
rafId = requestAnimationFrame(onResized);
@@ -218,16 +237,41 @@
addEvent(expand, 'scroll', onScroll);
addEvent(shrink, 'scroll', onScroll);
- // Fix for custom Elements
- requestAnimationFrame(reset);
+ // Fix for custom Elements
+ requestAnimationFrame(reset);
+ }
+
+ if (typeof ResizeObserver !== "undefined") {
+ observer = new ResizeObserver(function(element){
+ forEachElement(element, function (elem) {
+ callback.call(
+ this,
+ {
+ width: elem.contentRect.width,
+ height: elem.contentRect.height
+ }
+ );
+ });
+ });
+ if (element !== undefined) {
+ forEachElement(element, function(elem){
+ observer.observe(elem);
+ });
+ }
+ }
+ else {
+ forEachElement(element, function(elem){
+ attachResizeEvent(elem, callback);
+ });
}
-
- forEachElement(element, function(elem){
- attachResizeEvent(elem, callback);
- });
this.detach = function(ev) {
- ResizeSensor.detach(element, ev);
+ if (typeof ResizeObserver != "undefined") {
+ observer.unobserve(element);
+ }
+ else {
+ ResizeSensor.detach(element, ev);
+ }
};
this.reset = function() {
From cbc9d1afd4a04926b389079af4802bac9cd08ab6 Mon Sep 17 00:00:00 2001
From: Ben Beckford
Date: Tue, 20 Mar 2018 14:17:09 +0000
Subject: [PATCH 27/57] Fixed ResizeObserver detach error (#221)
Fixes error on detach: Uncaught TypeError: Failed to execute 'unobserve'
on 'ResizeObserver': parameter 1 is not of type 'Element'.
---
src/ResizeSensor.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index d03e17d..fcc6597 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -267,7 +267,9 @@
this.detach = function(ev) {
if (typeof ResizeObserver != "undefined") {
- observer.unobserve(element);
+ forEachElement(element, function(elem){
+ observer.unobserve(elem);
+ });
}
else {
ResizeSensor.detach(element, ev);
From eff187ee4931296b089f457071e8e3990e38c6d3 Mon Sep 17 00:00:00 2001
From: Juuso Palander
Date: Thu, 5 Jul 2018 17:38:21 +0300
Subject: [PATCH 28/57] Added sanity check to window.getComputedStyle in
ResizeSensor (#234)
---
src/ResizeSensor.js | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index fcc6597..8ef42b1 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -83,9 +83,9 @@
* @constructor
*/
var ResizeSensor = function(element, callback) {
-
+
var observer;
-
+
/**
*
* @constructor
@@ -147,7 +147,8 @@
'';
element.appendChild(element.resizeSensor);
- var position = window.getComputedStyle(element).getPropertyValue('position');
+ var computedStyle = window.getComputedStyle(element);
+ var position = computedStyle ? computedStyle.getPropertyValue('position') : null;
if ('absolute' !== position && 'relative' !== position && 'fixed' !== position) {
element.style.position = 'relative';
}
@@ -161,15 +162,15 @@
var lastWidth = size.width;
var lastHeight = size.height;
var initialHiddenCheck = true, resetRAF_id;
-
-
+
+
var resetExpandShrink = function () {
expandChild.style.width = '100000px';
expandChild.style.height = '100000px';
-
+
expand.scrollLeft = 100000;
expand.scrollTop = 100000;
-
+
shrink.scrollLeft = 100000;
shrink.scrollTop = 100000;
};
@@ -186,11 +187,11 @@
if (!resetRAF_id){
resetRAF_id = requestAnimationFrame(function(){
resetRAF_id = 0;
-
+
reset();
});
}
-
+
return;
} else {
// Stop checking
@@ -236,11 +237,11 @@
addEvent(expand, 'scroll', onScroll);
addEvent(shrink, 'scroll', onScroll);
-
+
// Fix for custom Elements
requestAnimationFrame(reset);
}
-
+
if (typeof ResizeObserver !== "undefined") {
observer = new ResizeObserver(function(element){
forEachElement(element, function (elem) {
From e1f3e0475a52b830d4b6490abd7b2984fbc8553f Mon Sep 17 00:00:00 2001
From: Sagiv ben giat
Date: Mon, 23 Jul 2018 22:54:19 +0300
Subject: [PATCH 29/57] max-width 100% for resize-sensor element (#238)
---
src/ResizeSensor.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 8ef42b1..c8fcfd6 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -134,7 +134,7 @@
element.resizeSensor = document.createElement('div');
element.resizeSensor.dir = 'ltr';
element.resizeSensor.className = 'resize-sensor';
- var style = 'position: absolute; left: -10px; top: -10px; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';
+ var style = 'position: absolute; left: -10px; top: -10px; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%';
var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';
element.resizeSensor.style.cssText = style;
From 5aa2dfcf2abc6489e00f48946ccd076fb6842747 Mon Sep 17 00:00:00 2001
From: Pauan
Date: Tue, 16 Oct 2018 00:11:41 -1000
Subject: [PATCH 30/57] Fixing to work with more recent versions of TypeScript
(#243)
Without this change I get this error from TypeScript:
```
Module '"node_modules/css-element-queries/src/ResizeSensor"' has no default export.
24 import ResizeSensor from "css-element-queries/src/ResizeSensor";
~~~~~~~~~~~~
```
---
src/ResizeSensor.d.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ResizeSensor.d.ts b/src/ResizeSensor.d.ts
index fe5bb03..6255ccf 100644
--- a/src/ResizeSensor.d.ts
+++ b/src/ResizeSensor.d.ts
@@ -3,4 +3,4 @@ declare class ResizeSensor {
detach(callback: Function): void;
}
-export = ResizeSensor;
+export default ResizeSensor;
From cd88cc057568565589cff02c97b3c3778bc79a23 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 16 Oct 2018 12:15:01 +0200
Subject: [PATCH 31/57] bump version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 28c459f..719efab 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.0.2",
+ "version": "1.0.3",
"description": "CSS-Element-Queries Polyfill. proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"directories": {
From 45334e9f36ede5e037d2749ff398daa20dc5ae22 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 16 Oct 2018 12:32:42 +0200
Subject: [PATCH 32/57] Reverted: #213 Use resizeobserver when available
due to incompatibility with dom elements detection
---
package.json | 2 +-
src/ElementQueries.js | 8 ++--
src/ResizeSensor.js | 87 +++++++++++--------------------------------
3 files changed, 26 insertions(+), 71 deletions(-)
diff --git a/package.json b/package.json
index 719efab..f65e95d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.0.3",
+ "version": "1.0.4",
"description": "CSS-Element-Queries Polyfill. proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"directories": {
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 65dc3c3..9ea9a0f 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -324,7 +324,7 @@
}
}
- element.resizeSensor = new ResizeSensor(element, check);
+ element.resizeSensorInstance = new ResizeSensor(element, check);
check();
}
@@ -482,11 +482,11 @@
delete element.elementQueriesSetupInformation;
delete element.elementQueriesSensor;
- } else if (element.resizeSensor) {
+ } else if (element.resizeSensorInstance) {
//responsive image
- element.resizeSensor.detach();
- delete element.resizeSensor;
+ element.resizeSensorInstance.detach();
+ delete element.resizeSensorInstance;
}
};
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index c8fcfd6..e26dcad 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -83,9 +83,6 @@
* @constructor
*/
var ResizeSensor = function(element, callback) {
-
- var observer;
-
/**
*
* @constructor
@@ -156,15 +153,21 @@
var expand = element.resizeSensor.childNodes[0];
var expandChild = expand.childNodes[0];
var shrink = element.resizeSensor.childNodes[1];
-
- var dirty, rafId;
+ var dirty, rafId, newWidth, newHeight;
var size = getElementSize(element);
var lastWidth = size.width;
var lastHeight = size.height;
var initialHiddenCheck = true, resetRAF_id;
+ var reset = function() {
+ //set display to block, necessary otherwise hidden elements won't ever work
+ var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;
+
+ if (invisible) {
+ var saveDisplay = element.style.display;
+ element.style.display = 'block';
+ }
- var resetExpandShrink = function () {
expandChild.style.width = '100000px';
expandChild.style.height = '100000px';
@@ -173,33 +176,10 @@
shrink.scrollLeft = 100000;
shrink.scrollTop = 100000;
- };
- var reset = function() {
- // Check if element is hidden
- if (initialHiddenCheck) {
- if (!expand.scrollTop && !expand.scrollLeft) {
-
- // reset
- resetExpandShrink();
-
- // Check in next frame
- if (!resetRAF_id){
- resetRAF_id = requestAnimationFrame(function(){
- resetRAF_id = 0;
-
- reset();
- });
- }
-
- return;
- } else {
- // Stop checking
- initialHiddenCheck = false;
- }
+ if (invisible) {
+ element.style.display = saveDisplay;
}
-
- resetExpandShrink();
};
element.resizeSensor.resetSensor = reset;
@@ -208,8 +188,8 @@
if (!dirty) return;
- lastWidth = size.width;
- lastHeight = size.height;
+ lastWidth = newWidth;
+ lastHeight = newHeight;
if (element.resizedAttached) {
element.resizedAttached.call(size);
@@ -217,8 +197,10 @@
};
var onScroll = function() {
- size = getElementSize(element);
- dirty = size.width !== lastWidth || size.height !== lastHeight;
+ var size = getElementSize(element);
+ var newWidth = size.width;
+ var newHeight = size.height;
+ dirty = newWidth !== lastWidth || newHeight !== lastHeight;
if (dirty && !rafId) {
rafId = requestAnimationFrame(onResized);
@@ -242,39 +224,12 @@
requestAnimationFrame(reset);
}
- if (typeof ResizeObserver !== "undefined") {
- observer = new ResizeObserver(function(element){
- forEachElement(element, function (elem) {
- callback.call(
- this,
- {
- width: elem.contentRect.width,
- height: elem.contentRect.height
- }
- );
- });
- });
- if (element !== undefined) {
- forEachElement(element, function(elem){
- observer.observe(elem);
- });
- }
- }
- else {
- forEachElement(element, function(elem){
- attachResizeEvent(elem, callback);
- });
- }
+ forEachElement(element, function(elem){
+ attachResizeEvent(elem, callback);
+ });
this.detach = function(ev) {
- if (typeof ResizeObserver != "undefined") {
- forEachElement(element, function(elem){
- observer.unobserve(elem);
- });
- }
- else {
- ResizeSensor.detach(element, ev);
- }
+ ResizeSensor.detach(element, ev);
};
this.reset = function() {
From 74791b6d41b4eff89c72edf4cc573c97aa4552be Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 16 Oct 2018 18:34:14 +0200
Subject: [PATCH 33/57] fixed resize sensor with elements that start hidden
---
src/ResizeSensor.js | 49 +++++++++++++++++++++++++----------------
tests/late-trigger.html | 48 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 78 insertions(+), 19 deletions(-)
create mode 100644 tests/late-trigger.html
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index e26dcad..32e6a1d 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -153,21 +153,14 @@
var expand = element.resizeSensor.childNodes[0];
var expandChild = expand.childNodes[0];
var shrink = element.resizeSensor.childNodes[1];
- var dirty, rafId, newWidth, newHeight;
+ var dirty, rafId;
var size = getElementSize(element);
var lastWidth = size.width;
var lastHeight = size.height;
- var initialHiddenCheck = true, resetRAF_id;
-
- var reset = function() {
- //set display to block, necessary otherwise hidden elements won't ever work
- var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;
-
- if (invisible) {
- var saveDisplay = element.style.display;
- element.style.display = 'block';
- }
+ var initialHiddenCheck = true;
+ var lastAnimationFrame = 0;
+ var resetExpandShrink = function () {
expandChild.style.width = '100000px';
expandChild.style.height = '100000px';
@@ -176,10 +169,30 @@
shrink.scrollLeft = 100000;
shrink.scrollTop = 100000;
+ };
- if (invisible) {
- element.style.display = saveDisplay;
+ var reset = function() {
+ // Check if element is hidden
+ if (initialHiddenCheck) {
+ var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;
+ if (invisible) {
+ // Check in next frame
+ if (!lastAnimationFrame){
+ lastAnimationFrame = requestAnimationFrame(function(){
+ lastAnimationFrame = 0;
+
+ reset();
+ });
+ }
+
+ return;
+ } else {
+ // Stop checking
+ initialHiddenCheck = false;
+ }
}
+
+ resetExpandShrink();
};
element.resizeSensor.resetSensor = reset;
@@ -188,8 +201,8 @@
if (!dirty) return;
- lastWidth = newWidth;
- lastHeight = newHeight;
+ lastWidth = size.width;
+ lastHeight = size.height;
if (element.resizedAttached) {
element.resizedAttached.call(size);
@@ -197,10 +210,8 @@
};
var onScroll = function() {
- var size = getElementSize(element);
- var newWidth = size.width;
- var newHeight = size.height;
- dirty = newWidth !== lastWidth || newHeight !== lastHeight;
+ size = getElementSize(element);
+ dirty = size.width !== lastWidth || size.height !== lastHeight;
if (dirty && !rafId) {
rafId = requestAnimationFrame(onResized);
diff --git a/tests/late-trigger.html b/tests/late-trigger.html
new file mode 100644
index 0000000..71a2b17
--- /dev/null
+++ b/tests/late-trigger.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From b4f79b37c16871d6442135f53453cc28f4b3e0e9 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 16 Oct 2018 18:34:26 +0200
Subject: [PATCH 34/57] bump version
---
package.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index f65e95d..93c85c9 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "css-element-queries",
- "version": "1.0.4",
- "description": "CSS-Element-Queries Polyfill. proof-of-concept for high-speed element dimension/media queries in valid css.",
+ "version": "1.0.5",
+ "description": "CSS-Element-Queries Polyfill. Proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"directories": {
"test": "test"
From da5f446f5b7dc847f3f26198154a7782aff85743 Mon Sep 17 00:00:00 2001
From: Nikita Skazki
Date: Thu, 18 Oct 2018 22:44:39 +0300
Subject: [PATCH 35/57] don't explode if an old browser can't provide element,
computed style, or style property (#241)
---
src/ElementQueries.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 9ea9a0f..23038d0 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -409,9 +409,11 @@
document.body.addEventListener(animationStart, function (e) {
var element = e.target;
- var styles = window.getComputedStyle(element, null);
+ var styles = element && window.getComputedStyle(element, null);
+ var animationName = styles && styles.getPropertyValue('animation-name');
+ var requiresSetup = animationName && (-1 !== animationName.indexOf('element-queries'));
- if (-1 !== styles.getPropertyValue('animation-name').indexOf('element-queries')) {
+ if (requiresSetup) {
element.elementQueriesSensor = new ResizeSensor(element, function () {
if (element.elementQueriesSetupInformation) {
element.elementQueriesSetupInformation.call();
From f6144fb52192efc6371aaebf0c72f7408fea17d3 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 6 Nov 2018 18:33:12 +0100
Subject: [PATCH 36/57] Added mutationobserver to detect DOM movements and
reset sensor accordingly.
fixed a bug in Safari where dragdrop doesn't work with huge sensors
dimensions.
---
src/ResizeSensor.d.ts | 1 +
src/ResizeSensor.js | 41 ++++++++++++++++-----
tests/mutation/app.js | 75 ++++++++++++++++++++++++++++++++++++++
tests/mutation/app.ts | 56 +++++++++++++++++++++++++++++
tests/mutation/index.html | 76 +++++++++++++++++++++++++++++++++++++++
tsconfig.json | 7 ++++
6 files changed, 248 insertions(+), 8 deletions(-)
create mode 100644 tests/mutation/app.js
create mode 100644 tests/mutation/app.ts
create mode 100644 tests/mutation/index.html
create mode 100644 tsconfig.json
diff --git a/src/ResizeSensor.d.ts b/src/ResizeSensor.d.ts
index 6255ccf..82215ca 100644
--- a/src/ResizeSensor.d.ts
+++ b/src/ResizeSensor.d.ts
@@ -1,6 +1,7 @@
declare class ResizeSensor {
constructor(element: (Element | Element[]), callback: Function);
detach(callback: Function): void;
+ reset(element: Element | Element[]): void;
}
export default ResizeSensor;
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 32e6a1d..a83d0f6 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -131,7 +131,8 @@
element.resizeSensor = document.createElement('div');
element.resizeSensor.dir = 'ltr';
element.resizeSensor.className = 'resize-sensor';
- var style = 'position: absolute; left: -10px; top: -10px; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%';
+ var style = 'pointer-events: none; position: absolute; left: 0px; top: 0px; right: 0; bottom: 0; ' +
+ 'overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%;';
var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';
element.resizeSensor.style.cssText = style;
@@ -161,14 +162,17 @@
var lastAnimationFrame = 0;
var resetExpandShrink = function () {
- expandChild.style.width = '100000px';
- expandChild.style.height = '100000px';
+ var width = element.offsetWidth;
+ var height = element.offsetHeight;
- expand.scrollLeft = 100000;
- expand.scrollTop = 100000;
+ expandChild.style.width = (width + 10) + 'px';
+ expandChild.style.height = (height + 10) + 'px';
- shrink.scrollLeft = 100000;
- shrink.scrollTop = 100000;
+ expand.scrollLeft = width + 10;
+ expand.scrollTop = height + 10;
+
+ shrink.scrollLeft = width + 10;
+ shrink.scrollTop = height + 10;
};
var reset = function() {
@@ -248,7 +252,7 @@
};
};
- ResizeSensor.reset = function(element, ev) {
+ ResizeSensor.reset = function(element) {
forEachElement(element, function(elem){
elem.resizeSensor.resetSensor();
});
@@ -271,6 +275,27 @@
});
};
+ if (typeof MutationObserver !== "undefined") {
+ var observer = new MutationObserver(function (mutations) {
+ for (var i in mutations) {
+ var items = mutations[i].addedNodes;
+ for (var j = 0; j < items.length; j++) {
+ if (items[j].resizeSensor) {
+ ResizeSensor.reset(items[j]);
+ }
+ }
+
+ }
+ });
+
+ document.addEventListener("DOMContentLoaded", function (event) {
+ observer.observe(document.body, {
+ childList: true,
+ subtree: true,
+ });
+ });
+ }
+
return ResizeSensor;
}));
diff --git a/tests/mutation/app.js b/tests/mutation/app.js
new file mode 100644
index 0000000..2100612
--- /dev/null
+++ b/tests/mutation/app.js
@@ -0,0 +1,75 @@
+var __values = (this && this.__values) || function (o) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
+ if (m) return m.call(o);
+ return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+};
+var e_1, _a, e_2, _b;
+var state = {
+ dragged: null
+};
+var i = 0;
+try {
+ for (var _c = __values(document.getElementsByClassName('drag')), _d = _c.next(); !_d.done; _d = _c.next()) {
+ var item = _d.value;
+ i++;
+ item.setAttribute('draggable', 'true');
+ item.setAttribute('id', 'drag-' + i);
+ (function (element) {
+ var title = 'Drag me #' + i;
+ element.setAttribute('data-label', title);
+ new ResizeSensor(element, function (size) {
+ element.setAttribute('data-label', title + " (" + size.width + "x" + size.height + ")");
+ });
+ })(item);
+ item.addEventListener('dragstart', function (event) {
+ state.dragged = event.target;
+ event.dataTransfer.setData('text', 'thanks firefox');
+ event.dataTransfer.dropEffect = 'move';
+ });
+ }
+}
+catch (e_1_1) { e_1 = { error: e_1_1 }; }
+finally {
+ try {
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
+ }
+ finally { if (e_1) throw e_1.error; }
+}
+var _loop_1 = function (item) {
+ (function (element) {
+ item.addEventListener('drop', function (event) {
+ event.preventDefault();
+ item.classList.remove('drag-hover');
+ state.dragged.parentNode.removeChild(state.dragged);
+ element.appendChild(state.dragged);
+ state.dragged = null;
+ });
+ })(item);
+ item.addEventListener('dragleave', function (event) {
+ item.classList.remove('drag-hover');
+ });
+ item.addEventListener('dragover', function (event) {
+ item.classList.add('drag-hover');
+ });
+ item.addEventListener('dragover', function (event) {
+ event.preventDefault();
+ });
+};
+try {
+ for (var _e = __values(document.getElementsByClassName('container')), _f = _e.next(); !_f.done; _f = _e.next()) {
+ var item = _f.value;
+ _loop_1(item);
+ }
+}
+catch (e_2_1) { e_2 = { error: e_2_1 }; }
+finally {
+ try {
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
+ }
+ finally { if (e_2) throw e_2.error; }
+}
diff --git a/tests/mutation/app.ts b/tests/mutation/app.ts
new file mode 100644
index 0000000..15974f7
--- /dev/null
+++ b/tests/mutation/app.ts
@@ -0,0 +1,56 @@
+declare const ResizeSensor;
+
+const state: {
+ dragged: Element
+} = {
+ dragged: null
+};
+
+let i = 0;
+
+for (const item of document.getElementsByClassName('drag')) {
+ i++;
+ item.setAttribute('draggable', 'true');
+ item.setAttribute('id', 'drag-' + i);
+
+ (element => {
+ const title = 'Drag me #' + i;
+ element.setAttribute('data-label', title);
+
+ new ResizeSensor(element, (size) => {
+ element.setAttribute('data-label', `${title} (${size.width}x${size.height})`);
+ });
+ })(item);
+
+ item.addEventListener('dragstart', (event: DragEvent) => {
+ state.dragged = event.target;
+ event.dataTransfer.setData('text', 'thanks firefox');
+ event.dataTransfer.dropEffect = 'move';
+ });
+}
+
+for (const item of document.getElementsByClassName('container')) {
+ (element => {
+ item.addEventListener('drop', (event) => {
+ event.preventDefault();
+ item.classList.remove('drag-hover');
+
+ state.dragged.parentNode.removeChild(state.dragged);
+ element.appendChild(state.dragged);
+
+ state.dragged = null;
+ });
+ })(item);
+
+ item.addEventListener('dragleave', (event) => {
+ item.classList.remove('drag-hover');
+ });
+
+ item.addEventListener('dragover', (event) => {
+ item.classList.add('drag-hover');
+ });
+
+ item.addEventListener('dragover', (event) => {
+ event.preventDefault();
+ });
+}
diff --git a/tests/mutation/index.html b/tests/mutation/index.html
new file mode 100644
index 0000000..6d2ddce
--- /dev/null
+++ b/tests/mutation/index.html
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..7b56f0e
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "downlevelIteration": true,
+ "lib" : ["dom","es6","dom.iterable","scripthost", "es2015.iterable", "es2015.collection"]
+ }
+}
\ No newline at end of file
From 8bc290cceb2dec934a0081c5e33d124eef7042e8 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Tue, 6 Nov 2018 18:34:17 +0100
Subject: [PATCH 37/57] bump version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 93c85c9..6376d58 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.0.5",
+ "version": "1.1.0",
"description": "CSS-Element-Queries Polyfill. Proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"directories": {
From 9cb667d81324cd4cecc10022b83be6d011a7b90f Mon Sep 17 00:00:00 2001
From: Michael Coleman
Date: Thu, 8 Nov 2018 10:25:09 -0500
Subject: [PATCH 38/57] =?UTF-8?q?added=20ResizeCallback=20to=20ResizeSenso?=
=?UTF-8?q?r.d.ts=20and=20added=20static=20functions=20=E2=80=A6=20(#248)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* added ResizeCallback to ResizeSensor.d.ts and added static functions to ResizeSensor class
* renaming ResizeCallback to ResizeSensorCallback
* added optional type to callback for detach methods on ResizeSensor
---
src/ResizeSensor.d.ts | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/ResizeSensor.d.ts b/src/ResizeSensor.d.ts
index 82215ca..b0a5fdf 100644
--- a/src/ResizeSensor.d.ts
+++ b/src/ResizeSensor.d.ts
@@ -1,7 +1,12 @@
+export declare type ResizeSensorCallback = (size: { width: number; height: number; }) => void;
+
declare class ResizeSensor {
- constructor(element: (Element | Element[]), callback: Function);
- detach(callback: Function): void;
- reset(element: Element | Element[]): void;
+ constructor(element: Element | Element[], callback: ResizeSensorCallback);
+ detach(callback?: ResizeSensorCallback): void;
+ reset(): void;
+
+ static detach(element: Element | Element[], callback?: ResizeSensorCallback): void;
+ static reset(element: Element | Element[]): void;
}
export default ResizeSensor;
From 09d4cf12a2bf2c143274bbe4e4bc04060e55880f Mon Sep 17 00:00:00 2001
From: Andreas Lubbe
Date: Fri, 9 Nov 2018 12:16:54 +0100
Subject: [PATCH 39/57] Make the MutationObserver of ResizeSensor compatible
with new Chrome version (#249)
The for-in loop over the `NodeList` now goes through the prototype chain, so we check `hasOwnProperty` first
---
src/ResizeSensor.js | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index a83d0f6..555a906 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -278,13 +278,14 @@
if (typeof MutationObserver !== "undefined") {
var observer = new MutationObserver(function (mutations) {
for (var i in mutations) {
- var items = mutations[i].addedNodes;
- for (var j = 0; j < items.length; j++) {
- if (items[j].resizeSensor) {
- ResizeSensor.reset(items[j]);
+ if (mutations.hasOwnProperty(i)) {
+ var items = mutations[i].addedNodes;
+ for (var j = 0; j < items.length; j++) {
+ if (items[j].resizeSensor) {
+ ResizeSensor.reset(items[j]);
+ }
}
}
-
}
});
From 31cabb56fb2af08470159251f6e535e2c3577758 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Fri, 9 Nov 2018 12:18:52 +0100
Subject: [PATCH 40/57] bump version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 6376d58..154a842 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.1.0",
+ "version": "1.1.1",
"description": "CSS-Element-Queries Polyfill. Proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"directories": {
From 7587a6553a8a240fe20479703bbd9d971571b51f Mon Sep 17 00:00:00 2001
From: Stephen Lautier
Date: Thu, 9 May 2019 11:13:38 +0200
Subject: [PATCH 41/57] feat(typings): export TS typings (#266)
---
css-element-queries.d.ts | 1 +
package.json | 1 +
src/ResizeSensor.d.ts | 2 +-
3 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 css-element-queries.d.ts
diff --git a/css-element-queries.d.ts b/css-element-queries.d.ts
new file mode 100644
index 0000000..0ca3bc3
--- /dev/null
+++ b/css-element-queries.d.ts
@@ -0,0 +1 @@
+export { ResizeSensor, ResizeSensorCallback } from "./src/ResizeSensor";
\ No newline at end of file
diff --git a/package.json b/package.json
index 154a842..8c38109 100644
--- a/package.json
+++ b/package.json
@@ -3,6 +3,7 @@
"version": "1.1.1",
"description": "CSS-Element-Queries Polyfill. Proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
+ "typings": "css-element-queries.d.ts",
"directories": {
"test": "test"
},
diff --git a/src/ResizeSensor.d.ts b/src/ResizeSensor.d.ts
index b0a5fdf..634ced0 100644
--- a/src/ResizeSensor.d.ts
+++ b/src/ResizeSensor.d.ts
@@ -1,6 +1,6 @@
export declare type ResizeSensorCallback = (size: { width: number; height: number; }) => void;
-declare class ResizeSensor {
+export declare class ResizeSensor {
constructor(element: Element | Element[], callback: ResizeSensorCallback);
detach(callback?: ResizeSensorCallback): void;
reset(): void;
From 0cadf8d661208028768ec25be239e1c78cfba9ea Mon Sep 17 00:00:00 2001
From: resurtm
Date: Thu, 9 May 2019 11:14:37 +0200
Subject: [PATCH 42/57] Fix Firefox extension content script #257 (#258)
---
src/ResizeSensor.js | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 555a906..03fb2e9 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -19,14 +19,21 @@
if (typeof window === "undefined") {
return null;
}
+ // https://github.com/Semantic-Org/Semantic-UI/issues/3855
+ // https://github.com/marcj/css-element-queries/issues/257
+ var globalWindow = typeof window != 'undefined' && window.Math == Math
+ ? window
+ : typeof self != 'undefined' && self.Math == Math
+ ? self
+ : Function('return this')();
// Only used for the dirty checking, so the event callback count is limited to max 1 call per fps per sensor.
// In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and
// would generate too many unnecessary events.
- var requestAnimationFrame = window.requestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
+ var requestAnimationFrame = globalWindow.requestAnimationFrame ||
+ globalWindow.mozRequestAnimationFrame ||
+ globalWindow.webkitRequestAnimationFrame ||
function (fn) {
- return window.setTimeout(fn, 20);
+ return globalWindow.setTimeout(fn, 20);
};
/**
From 389ca9900ca65a9104b2e965946b9f7f77c165bc Mon Sep 17 00:00:00 2001
From: jelhan
Date: Thu, 9 May 2019 11:15:35 +0200
Subject: [PATCH 43/57] fix: do not require Content-Secruity-Policy style-src
'unsafe-inline' (#256)
---
src/ResizeSensor.js | 68 +++++++++++++++++++++++++++++++++++----------
1 file changed, 53 insertions(+), 15 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 03fb2e9..32451e3 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -81,6 +81,18 @@
}
}
+ /**
+ * Apply CSS styles to element.
+ *
+ * @param {HTMLElement} element
+ * @param {Object} style
+ */
+ function setStyle(element, style) {
+ Object.keys(style).forEach(function(key) {
+ element.style[key] = style[key];
+ });
+ }
+
/**
* Class for dimension change detection.
*
@@ -138,18 +150,47 @@
element.resizeSensor = document.createElement('div');
element.resizeSensor.dir = 'ltr';
element.resizeSensor.className = 'resize-sensor';
- var style = 'pointer-events: none; position: absolute; left: 0px; top: 0px; right: 0; bottom: 0; ' +
- 'overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%;';
- var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';
-
- element.resizeSensor.style.cssText = style;
- element.resizeSensor.innerHTML =
- '' +
- '';
+
+ var style = {
+ pointerEvents: 'none',
+ position: 'absolute',
+ left: '0px',
+ top: '0px',
+ right: '0px',
+ bottom: '0px',
+ overflow: 'hidden',
+ zIndex: '-1',
+ visibility: 'hidden',
+ maxWidth: '100%'
+ };
+ var styleChild = {
+ position: 'absolute',
+ left: '0px',
+ top: '0px',
+ transition: '0s',
+ };
+
+ setStyle(element.resizeSensor, style);
+
+ var expand = document.createElement('div');
+ expand.className = 'resize-sensor-expand';
+ setStyle(expand, style);
+
+ var expandChild = document.createElement('div');
+ setStyle(expandChild, styleChild);
+ expand.appendChild(expandChild);
+
+ var shrink = document.createElement('div');
+ shrink.className = 'resize-sensor-shrink';
+ setStyle(shrink, style);
+
+ var shrinkChild = document.createElement('div');
+ setStyle(shrinkChild, styleChild);
+ setStyle(shrinkChild, { width: '200%', height: '200%' });
+ shrink.appendChild(shrinkChild);
+
+ element.resizeSensor.appendChild(expand);
+ element.resizeSensor.appendChild(shrink);
element.appendChild(element.resizeSensor);
var computedStyle = window.getComputedStyle(element);
@@ -158,9 +199,6 @@
element.style.position = 'relative';
}
- var expand = element.resizeSensor.childNodes[0];
- var expandChild = expand.childNodes[0];
- var shrink = element.resizeSensor.childNodes[1];
var dirty, rafId;
var size = getElementSize(element);
var lastWidth = size.width;
From eab5e1b51904d2570f979c941fded6b86dd3e7b0 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Thu, 9 May 2019 11:43:55 +0200
Subject: [PATCH 44/57] Trigger initially the resize sensor, fixes #265
---
src/ElementQueries.js | 5 ++---
src/ResizeSensor.d.ts | 21 +++++++++++++++++++++
src/ResizeSensor.js | 4 ++--
3 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/src/ElementQueries.js b/src/ElementQueries.js
index 23038d0..4fe4298 100755
--- a/src/ElementQueries.js
+++ b/src/ElementQueries.js
@@ -170,13 +170,12 @@
if (!element.elementQueriesSetupInformation) {
element.elementQueriesSetupInformation = new SetupInformation(element, id);
}
+
if (!element.elementQueriesSensor) {
element.elementQueriesSensor = new ResizeSensor(element, function () {
element.elementQueriesSetupInformation.call();
});
}
-
- element.elementQueriesSetupInformation.call();
}
/**
@@ -441,7 +440,7 @@
for (var i = 0, j = document.styleSheets.length; i < j; i++) {
try {
if (document.styleSheets[i].href && 0 === document.styleSheets[i].href.indexOf('file://')) {
- console.log("CssElementQueries: unable to parse local css files, " + document.styleSheets[i].href);
+ console.warn("CssElementQueries: unable to parse local css files, " + document.styleSheets[i].href);
}
readRules(document.styleSheets[i].cssRules || document.styleSheets[i].rules || document.styleSheets[i].cssText);
diff --git a/src/ResizeSensor.d.ts b/src/ResizeSensor.d.ts
index 634ced0..ad6c412 100644
--- a/src/ResizeSensor.d.ts
+++ b/src/ResizeSensor.d.ts
@@ -1,11 +1,32 @@
export declare type ResizeSensorCallback = (size: { width: number; height: number; }) => void;
export declare class ResizeSensor {
+ /**
+ * Creates a new resize sensor on given elements. The provided callback is called max 1 times per requestAnimationFrame and
+ * is called initially.
+ */
constructor(element: Element | Element[], callback: ResizeSensorCallback);
+
+ /**
+ * Removes the resize sensor, and stops listening to resize events.
+ */
detach(callback?: ResizeSensorCallback): void;
+
+ /**
+ * Resets the resize sensors, so for the next element resize is correctly detected. This is rare cases necessary
+ * when the resize sensor isn't initialised correctly or is in a broken state due to DOM modifications.
+ */
reset(): void;
+ /**
+ * Removes the resize sensor, and stops listening to resize events.
+ */
static detach(element: Element | Element[], callback?: ResizeSensorCallback): void;
+
+ /**
+ * Resets the resize sensors, so for the next element resize is correctly detected. This is rare cases necessary
+ * when the resize sensor isn't initialised correctly or is in a broken state due to DOM modifications.
+ */
static reset(element: Element | Element[]): void;
}
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 32451e3..ed4ef54 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -201,8 +201,8 @@
var dirty, rafId;
var size = getElementSize(element);
- var lastWidth = size.width;
- var lastHeight = size.height;
+ var lastWidth = 0;
+ var lastHeight = 0;
var initialHiddenCheck = true;
var lastAnimationFrame = 0;
From c4f7808afb490d81b7210b0b756ef3bda99d4cc5 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Thu, 9 May 2019 11:45:33 +0200
Subject: [PATCH 45/57] bump version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 8c38109..6aefde2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.1.1",
+ "version": "1.2.0",
"description": "CSS-Element-Queries Polyfill. Proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"typings": "css-element-queries.d.ts",
From 5d92e05e136137d11e0203c9d5ca06a99645f601 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Thu, 9 May 2019 11:47:18 +0200
Subject: [PATCH 46/57] added npmignore file
---
.npmignore | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 .npmignore
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..4f29079
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,2 @@
+.idea
+tests
From d1816ad53474b06e2d4c20fbaa5e3b00e46a0aaf Mon Sep 17 00:00:00 2001
From: ThibaudAV
Date: Wed, 17 Jul 2019 18:33:53 +0200
Subject: [PATCH 47/57] feat(typings): export ElementQueries typings (#267)
---
css-element-queries.d.ts | 3 ++-
src/ElementQueries.d.ts | 14 ++++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
create mode 100644 src/ElementQueries.d.ts
diff --git a/css-element-queries.d.ts b/css-element-queries.d.ts
index 0ca3bc3..97ee144 100644
--- a/css-element-queries.d.ts
+++ b/css-element-queries.d.ts
@@ -1 +1,2 @@
-export { ResizeSensor, ResizeSensorCallback } from "./src/ResizeSensor";
\ No newline at end of file
+export { ResizeSensor, ResizeSensorCallback } from "./src/ResizeSensor";
+export { ElementQueries } from './src/ElementQueries';
\ No newline at end of file
diff --git a/src/ElementQueries.d.ts b/src/ElementQueries.d.ts
new file mode 100644
index 0000000..00c5d93
--- /dev/null
+++ b/src/ElementQueries.d.ts
@@ -0,0 +1,14 @@
+export declare class ElementQueries {
+ /**
+ * Attaches to DOMLoadContent
+ */
+ static listen(): void;
+
+ /**
+ * Parses all available CSS and attach ResizeSensor to those elements which have rules attached.
+ * Make sure this is called after 'load' event, because CSS files are not ready when domReady is fired.
+ */
+ static init(): void;
+}
+
+export default ElementQueries;
From 7d0ffa0c8955f72be9650ce36ab4205d14ebeb29 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Wed, 17 Jul 2019 18:36:01 +0200
Subject: [PATCH 48/57] bump version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 6aefde2..36a73d7 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.2.0",
+ "version": "1.2.1",
"description": "CSS-Element-Queries Polyfill. Proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"typings": "css-element-queries.d.ts",
From 9fe2fbf47d1ab8b2f7ddc7765c46a8f23656af0b Mon Sep 17 00:00:00 2001
From: Julien Pradelle
Date: Wed, 2 Oct 2019 17:43:36 +0200
Subject: [PATCH 49/57] Add support of sticky position on ResizeSensor (#277)
---
src/ResizeSensor.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index ed4ef54..163292e 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -195,7 +195,7 @@
var computedStyle = window.getComputedStyle(element);
var position = computedStyle ? computedStyle.getPropertyValue('position') : null;
- if ('absolute' !== position && 'relative' !== position && 'fixed' !== position) {
+ if ('absolute' !== position && 'relative' !== position && 'fixed' !== position && 'sticky' !== position) {
element.style.position = 'relative';
}
From 4b06648bae36250ea6843a13a56ed5621e55d168 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Mon, 7 Oct 2019 14:42:36 +0200
Subject: [PATCH 50/57] Create FUNDING.yml
---
.github/FUNDING.yml | 1 +
1 file changed, 1 insertion(+)
create mode 100644 .github/FUNDING.yml
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..7e45dcf
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: marcj
From 1e406129f7112681d956eb36db0b0a3966e2ea7b Mon Sep 17 00:00:00 2001
From: Ruhao Gao
Date: Fri, 22 Nov 2019 23:57:44 +0800
Subject: [PATCH 51/57] cancelAnimationFrame for reset when detach is called
(#282)
In ResizeSensor, we use requestAnimationFrame for reset. However, if an element is added to DOM and removed from DOM very quickly (even before the first reset happens), the reset itself will stuck in an infinite loop. It also causes memory leak because the reset function holds the element forever.
---
src/ResizeSensor.js | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 163292e..2909cd0 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -102,6 +102,8 @@
* @constructor
*/
var ResizeSensor = function(element, callback) {
+ var lastAnimationFrame = 0;
+
/**
*
* @constructor
@@ -204,7 +206,7 @@
var lastWidth = 0;
var lastHeight = 0;
var initialHiddenCheck = true;
- var lastAnimationFrame = 0;
+ lastAnimationFrame = 0;
var resetExpandShrink = function () {
var width = element.offsetWidth;
@@ -281,7 +283,7 @@
addEvent(shrink, 'scroll', onScroll);
// Fix for custom Elements
- requestAnimationFrame(reset);
+ lastAnimationFrame = requestAnimationFrame(reset);
}
forEachElement(element, function(elem){
@@ -289,6 +291,11 @@
});
this.detach = function(ev) {
+ // clean up the unfinished animation frame to prevent a potential endless requestAnimationFrame of reset
+ if (!lastAnimationFrame) {
+ window.cancelAnimationFrame(lastAnimationFrame);
+ lastAnimationFrame = 0;
+ }
ResizeSensor.detach(element, ev);
};
From 8f127c7c96cb8c21253cbe07cf2f1a826ac0b575 Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Fri, 22 Nov 2019 17:13:16 +0100
Subject: [PATCH 52/57] bump version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 36a73d7..62e68f0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.2.1",
+ "version": "1.2.2",
"description": "CSS-Element-Queries Polyfill. Proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"typings": "css-element-queries.d.ts",
From 72adc49c52dc8bbc34de4e494952220fdae2af9e Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Fri, 3 Jan 2020 17:23:18 +0100
Subject: [PATCH 53/57] Fixed #282, #285 - fix issue with detecting invisible
elements.
---
src/ResizeSensor.js | 39 ++++++++++++++++++++++++++-------------
tests/demo.html | 33 +++++++++++++++++++++++++++++++--
2 files changed, 57 insertions(+), 15 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 2909cd0..12985d0 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -36,6 +36,13 @@
return globalWindow.setTimeout(fn, 20);
};
+ var cancelAnimationFrame = globalWindow.cancelAnimationFrame ||
+ globalWindow.mozCancelAnimationFrame ||
+ globalWindow.webkitCancelAnimationFrame ||
+ function (timer) {
+ globalWindow.clearTimeout(timer);
+ };
+
/**
* Iterate over each of the provided element(s).
*
@@ -102,8 +109,9 @@
* @constructor
*/
var ResizeSensor = function(element, callback) {
- var lastAnimationFrame = 0;
-
+ //Is used when checking in reset() only for invisible elements
+ var lastAnimationFrameForInvisibleCheck = 0;
+
/**
*
* @constructor
@@ -201,12 +209,15 @@
element.style.position = 'relative';
}
- var dirty, rafId;
+ var dirty = false;
+
+ //last request animation frame id used in onscroll event
+ var rafId = 0;
var size = getElementSize(element);
var lastWidth = 0;
var lastHeight = 0;
var initialHiddenCheck = true;
- lastAnimationFrame = 0;
+ lastAnimationFrameForInvisibleCheck = 0;
var resetExpandShrink = function () {
var width = element.offsetWidth;
@@ -228,10 +239,9 @@
var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;
if (invisible) {
// Check in next frame
- if (!lastAnimationFrame){
- lastAnimationFrame = requestAnimationFrame(function(){
- lastAnimationFrame = 0;
-
+ if (!lastAnimationFrameForInvisibleCheck){
+ lastAnimationFrameForInvisibleCheck = requestAnimationFrame(function(){
+ lastAnimationFrameForInvisibleCheck = 0;
reset();
});
}
@@ -282,8 +292,11 @@
addEvent(expand, 'scroll', onScroll);
addEvent(shrink, 'scroll', onScroll);
- // Fix for custom Elements
- lastAnimationFrame = requestAnimationFrame(reset);
+ // Fix for custom Elements and invisible elements
+ lastAnimationFrameForInvisibleCheck = requestAnimationFrame(function(){
+ lastAnimationFrameForInvisibleCheck = 0;
+ reset();
+ });
}
forEachElement(element, function(elem){
@@ -292,9 +305,9 @@
this.detach = function(ev) {
// clean up the unfinished animation frame to prevent a potential endless requestAnimationFrame of reset
- if (!lastAnimationFrame) {
- window.cancelAnimationFrame(lastAnimationFrame);
- lastAnimationFrame = 0;
+ if (!lastAnimationFrameForInvisibleCheck) {
+ cancelAnimationFrame(lastAnimationFrameForInvisibleCheck);
+ lastAnimationFrameForInvisibleCheck = 0;
}
ResizeSensor.detach(element, ev);
};
diff --git a/tests/demo.html b/tests/demo.html
index d8a75c2..22968f0 100644
--- a/tests/demo.html
+++ b/tests/demo.html
@@ -97,6 +97,15 @@
.example-2[min-width~="400px"] .example-2-box {
background-color: gray;
}
+
+ #example-invisible {
+ display: none;
+ }
+
+ #example-invisible[min-width~="100px"]{
+ color: red;
+ font-weight: bold;
+ }
+
+
+
Performance Demo
@@ -393,4 +422,4 @@
Performance Demo
-
\ No newline at end of file
+
From df88b1e9a738206cb0e624da424a19699d14638d Mon Sep 17 00:00:00 2001
From: "Marc J. Schmidt"
Date: Fri, 3 Jan 2020 17:25:48 +0100
Subject: [PATCH 54/57] bump version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 62e68f0..964230f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "css-element-queries",
- "version": "1.2.2",
+ "version": "1.2.3",
"description": "CSS-Element-Queries Polyfill. Proof-of-concept for high-speed element dimension/media queries in valid css.",
"main": "index.js",
"typings": "css-element-queries.d.ts",
From 97da8b71f90aa82d42ba61ebf2f05cf56f12cd24 Mon Sep 17 00:00:00 2001
From: Acinho <53146324+Acinho@users.noreply.github.com>
Date: Tue, 14 Apr 2020 01:12:01 +0200
Subject: [PATCH 55/57] Fixed check for canceling last animation frame for
invisible check (#289)
Co-authored-by: Aleksandar Adamovic
---
src/ResizeSensor.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 12985d0..2bae953 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -305,7 +305,7 @@
this.detach = function(ev) {
// clean up the unfinished animation frame to prevent a potential endless requestAnimationFrame of reset
- if (!lastAnimationFrameForInvisibleCheck) {
+ if (lastAnimationFrameForInvisibleCheck) {
cancelAnimationFrame(lastAnimationFrameForInvisibleCheck);
lastAnimationFrameForInvisibleCheck = 0;
}
From ee21dfe74f096e8733183296ad34af89a18992ba Mon Sep 17 00:00:00 2001
From: Achara
Date: Mon, 13 Apr 2020 19:14:10 -0400
Subject: [PATCH 56/57] fix invoking element.resizeSensor.resetSensor when it
is undefined to cause js error (#291)
Co-authored-by: akelley
---
src/ResizeSensor.js | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/ResizeSensor.js b/src/ResizeSensor.js
index 2bae953..9a25503 100755
--- a/src/ResizeSensor.js
+++ b/src/ResizeSensor.js
@@ -313,13 +313,19 @@
};
this.reset = function() {
- element.resizeSensor.resetSensor();
+ //To prevent invoking element.resizeSensor.resetSensor if it's undefined
+ if (element.resizeSensor.resetSensor) {
+ element.resizeSensor.resetSensor();
+ }
};
};
ResizeSensor.reset = function(element) {
forEachElement(element, function(elem){
- elem.resizeSensor.resetSensor();
+ //To prevent invoking element.resizeSensor.resetSensor if it's undefined
+ if (element.resizeSensor.resetSensor) {
+ elem.resizeSensor.resetSensor();
+ }
});
};
From 4eae4654f4683923153d8dd8f5c0d1bc2067b2a8 Mon Sep 17 00:00:00 2001
From: Maksym Kobieliev
Date: Fri, 3 Jul 2020 18:51:03 +0300
Subject: [PATCH 57/57] Add a Size interface to the typings (#293)
Co-authored-by: Maksym Kobieliev
---
css-element-queries.d.ts | 2 +-
src/ResizeSensor.d.ts | 7 ++++++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/css-element-queries.d.ts b/css-element-queries.d.ts
index 97ee144..3fe0706 100644
--- a/css-element-queries.d.ts
+++ b/css-element-queries.d.ts
@@ -1,2 +1,2 @@
-export { ResizeSensor, ResizeSensorCallback } from "./src/ResizeSensor";
+export { ResizeSensor, ResizeSensorCallback, Size } from "./src/ResizeSensor";
export { ElementQueries } from './src/ElementQueries';
\ No newline at end of file
diff --git a/src/ResizeSensor.d.ts b/src/ResizeSensor.d.ts
index ad6c412..3fba8c6 100644
--- a/src/ResizeSensor.d.ts
+++ b/src/ResizeSensor.d.ts
@@ -1,4 +1,9 @@
-export declare type ResizeSensorCallback = (size: { width: number; height: number; }) => void;
+export declare interface Size {
+ width: number;
+ height: number;
+}
+
+export declare type ResizeSensorCallback = (size: Size) => void;
export declare class ResizeSensor {
/**