accessibility_盲网快捷键

可访问性优化

目前为 2018-12-02 提交的版本,查看 最新版本

// ==UserScript==
// @name         accessibility_盲网快捷键
// @namespace    https://www.zhihu.com/people/yin-xiao-bo-11
// @require https://greasyfork.org/scripts/375077-handlekey/code/handleKey.js?version=649955
// @version      0.1.5.1
// @description  可访问性优化
// @author       Veg
// @include    http://www.zd.hk/*
// @include    http://apk.qt06.com/*
// @include    http://*.amhl.net/*
// @include    http://*tingyouwang.com/*
// @include    http://bbs.amtkjy.com/*
// @grant        none
// ==/UserScript==
"use strict";
var host = window.location.host;
//包含页面所有元素的数组
let zdElement = [];
let zdFES;

function zdHotKey(k) {
    if (!k.altKey) {
        return false;
    } else {
        //获取页面所有元素,push 给 zdElement 数组
        zdElement.length = 0;
        var all = document.all;
        for (var i = 0, l = all.length; i < l; i++) {
            if (all[i].nodeType == 1) {
                zdElement.push(all[i]);
            }
        }
        //获取焦点元素的数组下标
        zdFES = zdGetSubscript(zdElement, document.activeElement);

        if (host === 'www.zd.hk') {
            //页面包含指定元素才执行快捷键函数
            var subject = document.querySelector('a.subject_link');
            if (subject !== null) {
                subjectHotKey(k);
            }
            var message = document.querySelector('div.message')
            if (message !== null) {
                floorHotKey(k);
            }
        }
        if (host === 'bbs.amhl.net' || host === 'www.amhl.net' || host === 'apk.qt06.com' || host === 'tingyouwang.com' || host === 'www.tingyouwang.com' || host === 'bbs.amtkjy.com') {
            accesskey(k);
        }
    }
}
document.addEventListener('keydown', function (k) {
    zdHotKey(k);
    if (host === 'www.zd.hk') {
        player(k);
    }
}, null);
//获取数组下标的函数
function zdGetSubscript(arrays, obj) {
    var i = arrays.length;
    while (i--) {
        if (arrays[i] === obj) {
            return i;
        }
    }
    return false;
}

function subjectHotKey(k) {
    let subscriptArray = [];
    var target = zdElement.filter(function (t) {
        if ((t.classList.contains('subject_link') || t.innerText == '下一页' || t.innerText == '上一页') && t.tagName == 'A') {
            if (t.hasAttribute('accesskey')) {
                t.removeAttribute('accesskey', '*');
            }
            subscriptArray.push(zdGetSubscript(zdElement, t));
            return t;
        }
    });
    if (k.shiftKey && k.altKey && k.keyCode == 88) {
        previousTarget(target, subscriptArray);
    }
    if (k.shiftKey) return false;
    if (k.altKey && k.keyCode == 88) {
        nextTarget(target, subscriptArray)
    }
}

//楼层
function floorHotKey(k) {
    let subscriptArray = [];
    var target = zdElement.filter(function (t) {
        if (t.getAttribute('tabindex') == '-1' && t.tagName == 'DIV' && !t.hasAttribute('role') || (t.innerText == '下一页' || t.innerText == '上一页') && t.tagName == 'A' && !t.hasAttribute('role')) {
            if (t.offsetParent !== null) {
                if (t.getAttribute('aria-label') == null) {
                    t.setAttribute('aria-label', t.parentNode.innerText);
                    if (t.hasAttribute('accesskey')) {
                        t.removeAttribute('accesskey', '*');
                    }
                }
                if (t.innerText == '上一页' && t.tagName == 'A') {
                    t.classList.add('zd-page-up');
                }
                if (t.innerText == '下一页' && t.tagName == 'A') {
                    t.classList.add('zd-page-down');
                }
                subscriptArray.push(zdGetSubscript(zdElement, t));
                return t;
            }
        }
    });
    if (document.querySelector('a.zd-page-up') !== null) {
        document.querySelector('a.zd-page-up').setAttribute('role', 'link');
    }
    if (document.querySelector('a.zd-page-down') !== null) {
        document.querySelector('a.zd-page-down').setAttribute('role', 'link');
    }

    if (k.shiftKey && k.altKey && k.keyCode == 88) {
        previousTarget(target, subscriptArray);
    }
    if (k.shiftKey) return false;
    if (k.altKey && k.keyCode == 88) {
        nextTarget(target, subscriptArray)
    }
}

function previousTarget(target, subscriptArray) {
    for (var i = 0, l = target.length || subscriptArray.length; i < l; i++) {
        if (zdFES > subscriptArray[l - 1] || zdFES <= subscriptArray[0]) {
            target[l - 1].focus();
            break;
        } else if (zdFES <= subscriptArray[i]) {
            var xv = zdGetSubscript(target, target[i]);
            target[xv - 1].focus();
            break;
        }
    }
    return false;
}

function nextTarget(target, subscriptArray) {
    for (var i = 0, l = target.length || subscriptArray.length; i < l; i++) {
        if (zdFES < subscriptArray[i]) {
            var xv = zdGetSubscript(target, target[i]);
            target[xv].focus();
            break;
        } else if (zdFES < subscriptArray[0] || zdFES >= subscriptArray[l - 1]) {
            target[0].focus();
            break;
        }
    }
    return false;
}

function accesskey(k) {
    let Xscript = [];
    var xAcc = handleKey('x', 'accesskey-x', Xscript);

    let Zscript = [];
    var zAcc = handleKey('z', 'accesskey-z', Zscript);

    if (k.shiftKey && k.altKey && k.keyCode == 88) {
        previousTarget(xAcc, Xscript);
    }
    if (k.shiftKey && k.altKey && k.keyCode == 90) {
        previousTarget(zAcc, Zscript);
    }
    if (k.shiftKey) return false;
    if (k.altKey && k.keyCode == 88) {
        nextTarget(xAcc, Xscript)
    }
    if (k.altKey && k.keyCode == 90) {
        nextTarget(zAcc, Zscript)
    }
}

function player(k) {
    var audios = document.querySelector('div.plyr--playing');
    if (audios !== null) {
        var audio = audios.querySelector('audio');
        if (audio !== null) {
            if (k.shiftKey && k.keyCode == 32) {

                if (audio.paused !== true) {
                    audio.pause();
                } else if (audio.play !== true) {
                    audio.play();
                }
            }
            var volume = audio.volume;
            if (k.shiftKey && k.keyCode == 38) {
                audio.volume = volume + 0.05;
            }
            if (k.shiftKey && k.keyCode == 40) {
                audio.volume = volume - 0.05;
            }
            if (k.shiftKey && k.keyCode == 37) {
                audio.currentTime -= 10;
            }
            if (k.shiftKey && k.keyCode == 39) {
                audio.currentTime += 10;
            }
            if (k.shiftKey && k.keyCode == 34) {
                audio.currentTime = 0;
                audio.play();
            }
            if (k.shiftKey && k.keyCode == 33) {
                if (audio.muted == true) {
                    audio.muted = false;
                } else {
                    audio.muted = true;
                }
            }
        }
    }
}