diff --git a/src/component.js b/src/component.js index 48520bb375..6fb6167ec5 100644 --- a/src/component.js +++ b/src/component.js @@ -132,6 +132,7 @@ function renderComponent(component) { newVNode._original = oldVNode._original + 1; if (options.vnode) options.vnode(newVNode); + let focus = document.activeElement; diff( parentDom, newVNode, @@ -146,7 +147,7 @@ function renderComponent(component) { ); newVNode._parent._children[newVNode._index] = newVNode; - commitRoot(commitQueue, newVNode, refQueue); + commitRoot(commitQueue, newVNode, refQueue, focus); if (newVNode._dom != oldDom) { updateParentDomPointers(newVNode); diff --git a/src/diff/index.js b/src/diff/index.js index b5bbb49db6..03e78d0468 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -310,7 +310,7 @@ export function diff( * which have callbacks to invoke in commitRoot * @param {VNode} root */ -export function commitRoot(commitQueue, root, refQueue) { +export function commitRoot(commitQueue, root, refQueue, focussedElement) { root._nextDom = undefined; for (let i = 0; i < refQueue.length; i++) { @@ -332,6 +332,13 @@ export function commitRoot(commitQueue, root, refQueue) { options._catchError(e, c._vnode); } }); + + if ( + focussedElement !== document.activeElement && + focussedElement.isConnected + ) { + focussedElement.focus(); + } } /** diff --git a/src/render.js b/src/render.js index 1ee326bc92..ad26c1dbec 100644 --- a/src/render.js +++ b/src/render.js @@ -34,6 +34,8 @@ export function render(vnode, parentDom, replaceNode) { // List of effects that need to be called after diffing. let commitQueue = [], refQueue = []; + let focus = document.activeElement; + diff( parentDom, // Determine the new vnode tree and store it on the DOM element on @@ -60,7 +62,7 @@ export function render(vnode, parentDom, replaceNode) { ); // Flush all queued effects - commitRoot(commitQueue, vnode, refQueue); + commitRoot(commitQueue, vnode, refQueue, focus); } /** diff --git a/test/browser/focus.test.js b/test/browser/focus.test.js index 96348f6a3d..2795eca38e 100644 --- a/test/browser/focus.test.js +++ b/test/browser/focus.test.js @@ -156,7 +156,7 @@ describe('focus', () => { teardown(scratch); }); - it.skip('should maintain focus when swapping elements', () => { + it('should maintain focus when swapping elements', () => { render(