Preserve focus

When re-focusing page content, return focus to element that was active before blur, instead of root element.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name        Preserve focus
// @include        *
// @namespace   myfonj
// @grant       none
// @version     1.0
// @author      myf
// @description When re-focusing page content, return focus to element that was active before blur, instead of root element.
// ==/UserScript==

// https://greasyfork.org/en/scripts/427948/versions/new

var lastFocusedElement = document.activeElement;

window.addEventListener('blur', saveFocus, false);
window.addEventListener('focus', loadFocus, false);

function saveFocus(){
  // console.info('saving active element', {lastFocusedElement});
  lastFocusedElement = document.activeElement;
}

function loadFocus(){
  if(!lastFocusedElement) {
    // console.info('no lastFocusedElement');
    return
  }
  if(lastFocusedElement == document.activeElement) {
    // console.info('focus is already on right element', lastFocusedElement);
    return
  }
  // console.info('focusing', lastFocusedElement);
  lastFocusedElement.focus();
}