diff --git a/js/core/ui.js b/js/core/ui.js
index 29d07ef4ba..0445ede339 100644
--- a/js/core/ui.js
+++ b/js/core/ui.js
@@ -132,7 +132,7 @@ define(
})
.appendTo($div)
;
- doc.firstElementChild.addEventListener("click", function(){
+ doc.documentElement.addEventListener("click", function(){
if(window.getComputedStyle($menu[0]).display === "block"){
$menu.fadeOut(200);
}
diff --git a/js/core/utils.js b/js/core/utils.js
index 0e7833c0af..c100f15073 100644
--- a/js/core/utils.js
+++ b/js/core/utils.js
@@ -34,13 +34,35 @@ define(
return function(doc, insertionPoint) {
node.remove();
doc.adoptNode(node);
- if (insertionPoint.firstElementChild) {
- insertionPoint.insertBefore(node, insertionPoint.firstElementChild);
+ var firstElementChild = this.findFirstElementChild(insertionPoint);
+ if (firstElementChild) {
+ insertionPoint.insertBefore(node, firstElementChild);
return;
}
insertionPoint.appendChild(node);
- };
+ }.bind(this);
}
+ /**
+ * Finds the first Element child, given a node. Provides support for
+ * Microsoft Edge's missing support of .firstElementChild.
+ *
+ * @param {Node} node The node to be traversed.
+ * @return {Element} The first Element in the child list.
+ */
+ , findFirstElementChild: function(node){
+ if(!node.hasChildNodes()){
+ return null;
+ }
+ // We have native support
+ if(node.firstElementChild){
+ return node.firstElementChild;
+ }
+ return Array
+ .from(node.childNodes)
+ .find(function(node){
+ return node.nodeType === Node.ELEMENT_NODE;
+ });
+ }
, calculateLeftPad: function(text) {
if (typeof text !== "string") {
throw new TypeError("Invalid input");
diff --git a/tests/spec/core/utils-spec.js b/tests/spec/core/utils-spec.js
index a75b07962b..2f83547417 100644
--- a/tests/spec/core/utils-spec.js
+++ b/tests/spec/core/utils-spec.js
@@ -98,6 +98,20 @@ describe("Core - Utils", function() {
});
});
+ describe("findFirstElementChild() method", function(){
+ it("doesn't find elements when there are none to find", function(done){
+ var textNode = document.createTextNode("text");
+ expect(utils.findFirstElementChild(textNode)).toBe(null);
+ done();
+ });
+ it("finds the first Element child amongst a list of nodes", function(done){
+ var div = document.createElement("div");
+ div.innerHTML = "text pass text fail text";
+ expect(utils.findFirstElementChild(div)).toBeTruthy();
+ expect(utils.findFirstElementChild(div).textContent).toEqual("pass");
+ done();
+ });
+ });
describe("toESIterable() method", function() {