HjklNavigation

Shortcuts for Google Search result. j/k to move focus, l/h to open in new/background tab.

目前为 2021-03-16 提交的版本,查看 最新版本

// ==UserScript==
// @name         HjklNavigation
// @namespace    com.gmail.fujifruity.greasemonkey
// @version      1.3
// @description  Shortcuts for Google Search result. j/k to move focus, l/h to open in new/background tab.
// @author       fujifruity
// @include      https://www.google.com/search*
// @grant        GM.openInTab
// @license      MIT
// ==/UserScript==

{
    const googleUrl = "www.google.com"
    // Add another URL variable and @include above.
    // This script may fits most list-like elements.

    let focusIdx = null

    const results = (() => {
        switch (location.hostname) {
            case googleUrl: return document.querySelectorAll('.hlcw0c > .g')
            // add another case here
            default: return null
        }
    })()

    const open = (result, isBackground) => {
        switch (location.hostname) {
            case googleUrl: {
                const url = result.getElementsByTagName('a')[0].href
                GM.openInTab(url, isBackground)
                break
            }
            // add another case here
        }
    }

    const refocus = nextIdx => {
        if (focusIdx == null) {
            focusIdx = 0
        } else {
            results[focusIdx].style.backgroundColor = null
            focusIdx = nextIdx
        }
        results[focusIdx].style.backgroundColor = 'lightyellow'
        results[focusIdx].scrollIntoView({ behavior: "smooth", block: "center" })
    }

    window.addEventListener('keydown', event => {
        if (event.target.tagName == "INPUT" || event.ctrlKey || event.altKey) return
        const result = results[focusIdx]
        switch (event.key) {
            case 'j': {
                refocus((focusIdx + 1) % results.length)
                break
            }
            case 'k': {
                refocus((focusIdx - 1 + results.length) % results.length)
                break
            }
            case 'l': {
                open(result, false)
                break
            }
            case 'h': {
                open(result, true)
                break
            }
            case 'g': {
                refocus(0)
                break
            }
            case 'G': {
                refocus(results.length - 1)
                break
            }
        }
    })

}