diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc
index 58341a5152..4cbf104a83 100644
--- a/src/objectliterals.jsdoc
+++ b/src/objectliterals.jsdoc
@@ -30,7 +30,8 @@
* then it gets set by using `window.devicePixelRatio`.
* @property {ol.Collection|Array.
|undefined} interactions
* Interactions that are initially added to the map.
- * @property {Element|Document|undefined} keyboardEventTarget The element to listen to keyboard events on.
+ * @property {Element|Document|string|undefined} keyboardEventTarget
+ * The element to listen to keyboard events on.
* This determines when the `KeyboardPan` and `KeyboardZoom` interactions trigger. For example, if
* this option is set to `document` the keyboard interactions will always trigger. If this option
* is not specified, the element the library listens to keyboard events on is the map target (i.e.
diff --git a/src/ol/map.js b/src/ol/map.js
index bb2b89be95..140a841f31 100644
--- a/src/ol/map.js
+++ b/src/ol/map.js
@@ -1336,8 +1336,14 @@ ol.Map.createOptionsInternal = function(options) {
/**
* @type {Element|Document}
*/
- var keyboardEventTarget = goog.isDef(options.keyboardEventTarget) ?
- options.keyboardEventTarget : null;
+ var keyboardEventTarget = null;
+ if (goog.isDef(options.keyboardEventTarget)) {
+ // cannot use goog.dom.getElement because its argument cannot be
+ // of type Document
+ keyboardEventTarget = goog.isString(options.keyboardEventTarget) ?
+ document.getElementById(options.keyboardEventTarget) :
+ options.keyboardEventTarget;
+ }
/**
* @type {Object.}