diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index 1e6b057e..c0902e27 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -75,7 +75,14 @@ var TextInput = function(parentNode, host) { host.onFocus(e); resetSelection(); }); - this.focus = function() { text.focus(); }; + this.focus = function() { + text.style.position = "fixed"; + text.style.top = "-10000000px"; + text.focus(); + setTimeout(function() { + text.style.position = ""; + }, 0); + }; this.blur = function() { text.blur(); }; this.isFocused = function() { return isFocused; diff --git a/lib/ace/mouse/mouse_handler.js b/lib/ace/mouse/mouse_handler.js index 9cf26721..6b331eee 100644 --- a/lib/ace/mouse/mouse_handler.js +++ b/lib/ace/mouse/mouse_handler.js @@ -47,10 +47,12 @@ var MouseHandler = function(editor) { new DefaultGutterHandler(this); new DragdropHandler(this); - var focusEditor = function(e) { - if (!editor.isFocused() && editor.textInput) - editor.textInput.moveToMouse(e); - editor.focus() + var focusEditor = function(e) { + // because we have to call event.preventDefault() any window on ie and iframes + // on other browsers do not get focus, so we have to call window.focus() here + if (!document.hasFocus || !document.hasFocus()) + window.focus(); + editor.focus(); }; var mouseTarget = editor.renderer.getMouseEventTarget(); diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 820b054d..ae438ae8 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -375,6 +375,9 @@ var VirtualRenderer = function(container, theme) { if (this.resizing) this.resizing = 0; + // reset cached values on scrollbars, needs to be removed when switching to non-native scrollbars + // see https://github.com/ajaxorg/ace/issues/2195 + this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null; }; this.$updateCachedSize = function(force, gutterWidth, width, height) { @@ -634,9 +637,12 @@ var VirtualRenderer = function(container, theme) { var posLeft = this.$cursorLayer.$pixelPos.left; posTop -= config.offset; + var style = this.textarea.style; var h = this.lineHeight; - if (posTop < 0 || posTop > config.height - h) + if (posTop < 0 || posTop > config.height - h) { + style.top = style.left = "0"; return; + } var w = this.characterWidth; if (this.$composition) { @@ -649,11 +655,10 @@ var VirtualRenderer = function(container, theme) { posLeft = this.$size.scrollerWidth - w; posLeft += this.gutterWidth; - - this.textarea.style.height = h + "px"; - this.textarea.style.width = w + "px"; - this.textarea.style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + "px"; - this.textarea.style.top = Math.min(posTop, this.$size.height - h) + "px"; + style.height = h + "px"; + style.width = w + "px"; + style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + "px"; + style.top = Math.min(posTop, this.$size.height - h) + "px"; }; /**