Greasy Fork

Greasy Fork is available in English.

HjklNavigation

Shortcuts for Google Search result. j or k to move focus, l to open. (I have no idea to do with h.)

目前为 2020-12-21 提交的版本。查看 最新版本

// ==UserScript==
// @name         HjklNavigation
// @namespace    com.gmail.fujifruity.greasemonkey
// @version      1.0
// @description  Shortcuts for Google Search result. j or k to move focus, l to open. (I have no idea to do with h.)
// @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 handle most list-like elements.

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

    function open(result) {
        switch (location.hostname) {
            case googleUrl: {
                const url = result.firstChild.firstChild.href
                GM.openInTab(url, false)
                break
            }
            // add another one here
        }
    }

    let focuseIdx = null

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

    function onKeydown(event) {
        if (event.target.tagName == "INPUT" || event.ctrlKey || event.altKey) return
        const result = results[focuseIdx]
        switch (event.key) {
            case 'j': {
                refocus((focuseIdx + 1) % results.length)
                break
            }
            case 'k': {
                refocus((focuseIdx - 1 + results.length) % results.length)
                break
            }
            case 'l': {
                open(result)
                break
            }
            case 'g': {
                refocus(0)
                break
            }
            case 'G': {
                refocus(results.length - 1)
                break
            }
        }
    }

    window.addEventListener('keydown', onKeydown)

}