diff --git a/awesomplete.js b/awesomplete.js
index <HASH>..<HASH> 100644
--- a/awesomplete.js
+++ b/awesomplete.js
@@ -147,6 +147,10 @@ _.prototype = {
 	},
 
 	close: function () {
+		if (!this.opened) {
+			return;
+		}
+
 		this.ul.setAttribute("hidden", "");
 		this.index = -1;
 
diff --git a/test/api/closeSpec.js b/test/api/closeSpec.js
index <HASH>..<HASH> 100644
--- a/test/api/closeSpec.js
+++ b/test/api/closeSpec.js
@@ -26,4 +26,12 @@ describe("awesomplete.close", function () {
 
 		expect(handler).toHaveBeenCalled();
 	});
+
+	it("returns early if already closed", function () {
+		var handler = $.spyOnEvent(this.subject.input, "awesomplete-close");
+		this.subject.close();
+		this.subject.close();
+
+		expect(handler.calls.count()).toBe(1);
+	});
 });
Return early from close if not open

If the popup is already in a closed state, return early from
`Awesomplete.prototype.close` so as to guarantee that when
`awesomplete-close` events get triggered, the popup *was* actually
closed.