From 7c40b4df578da1a30f6726fce90f546f55300974 Mon Sep 17 00:00:00 2001 From: Nick Colley Date: Mon, 24 Feb 2020 16:31:42 +0000 Subject: [PATCH] Add Element.prototype.previousElementSibling polyfill --- .../previousElementSibling/config.toml | 25 +++++++++++ .../previousElementSibling/detect.js | 1 + .../previousElementSibling/polyfill.js | 7 +++ .../prototype/previousElementSibling/tests.js | 45 +++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 polyfills/Element/prototype/previousElementSibling/config.toml create mode 100644 polyfills/Element/prototype/previousElementSibling/detect.js create mode 100644 polyfills/Element/prototype/previousElementSibling/polyfill.js create mode 100644 polyfills/Element/prototype/previousElementSibling/tests.js diff --git a/polyfills/Element/prototype/previousElementSibling/config.toml b/polyfills/Element/prototype/previousElementSibling/config.toml new file mode 100644 index 000000000..123e9e31b --- /dev/null +++ b/polyfills/Element/prototype/previousElementSibling/config.toml @@ -0,0 +1,25 @@ +aliases = [ ] +dependencies = [ + "Element", + "Object.defineProperty" +] +license = "MIT" +docs = "https://developer.mozilla.org/en-US/docs/Web/API/NonDocumentTypeChildNode/previousElementSibling" + +[browsers] +android = "todo" +bb = "todo" +chrome = "todo" +edge = "todo" +edge_mob = "todo" +firefox = "todo" +ios_chr = "todo" +ios_saf = "todo" +ie = "todo" +ie_mob = "todo" +opera = "todo" +op_mini = "todo" +op_mob = "todo" +safari = "todo" +firefox_mob = "todo" +samsung_mob = "todo" diff --git a/polyfills/Element/prototype/previousElementSibling/detect.js b/polyfills/Element/prototype/previousElementSibling/detect.js new file mode 100644 index 000000000..a0cc375c4 --- /dev/null +++ b/polyfills/Element/prototype/previousElementSibling/detect.js @@ -0,0 +1 @@ +'document' in self && "previousElementSibling" in document.documentElement diff --git a/polyfills/Element/prototype/previousElementSibling/polyfill.js b/polyfills/Element/prototype/previousElementSibling/polyfill.js new file mode 100644 index 000000000..efd20a14f --- /dev/null +++ b/polyfills/Element/prototype/previousElementSibling/polyfill.js @@ -0,0 +1,7 @@ +Object.defineProperty(Element.prototype, 'previousElementSibling', { + get: function(){ + var el = this.previousSibling; + while (el && el.nodeType !== 1) { el = el.previousSibling; } + return el; + } +}); diff --git a/polyfills/Element/prototype/previousElementSibling/tests.js b/polyfills/Element/prototype/previousElementSibling/tests.js new file mode 100644 index 000000000..cb8eff7d3 --- /dev/null +++ b/polyfills/Element/prototype/previousElementSibling/tests.js @@ -0,0 +1,45 @@ +it("should return null if the node is the only child of its parent node", function () { + var parent = document.createElement('div'), + p = document.createElement('p'); + parent.appendChild(p); + + proclaim.strictEqual(p.nextElementSibling, null); +}); + +it("should return null if the node only has text sibling", function () { + var parent = document.createElement('div'), + p = document.createElement('p'); + text = document.createTextNode('Hi there, how are you doing today?'); + parent.appendChild(p); + parent.appendChild(text); + + proclaim.strictEqual(p.nextElementSibling, null); +}); + +it("should return null if the node only has comment sibling", function () { + var parent = document.createElement('div'), + p = document.createElement('p'); + comment = document.createComment('This is a comment in the document.'); + parent.appendChild(p); + parent.appendChild(comment); + + proclaim.strictEqual(p.nextElementSibling, null); +}); + +it("should return the first child element", function () { + var parent = document.createElement('div'), + h2 = document.createElement('h2'), + p1 = document.createElement('p'), + p2 = document.createElement('p'), + p3 = document.createElement('p'), + text = document.createTextNode('Hi there, how are you doing today?'), + comment = document.createComment('This is a comment in the document.'); + parent.appendChild(h2); + parent.appendChild(text); + parent.appendChild(comment); + parent.appendChild(p1); + parent.appendChild(p2); + parent.appendChild(p3); + + proclaim.strictEqual(h2.nextElementSibling, p1); +});