accessibility_盲网快捷键

可访问性优化

目前為 2018-02-27 提交的版本,檢視 最新版本

// ==UserScript==
// @name         accessibility_盲网快捷键
// @namespace    https://www.zhihu.com/people/yin-xiao-bo-11
// @version      0.1.3
// @description  可访问性优化
// @author       Veg
// @include    http://www.zd.hk/*
// @include    http://apk.qt06.com/*
// @include    http://bbs.amhl.net/*
// @include    http://www.amhl.net/*
// @grant        none
// ==/UserScript==

(function () {
    setTimeout(function () {
        proc(document); amo(proc);
    }, 10);
    function proc(d) {

        var url = window.location.href;
        var token = url.substring(7, 15);
        if (token == 'www.zd.h' || token == 'apk.qt06') {
            //争渡网和安卓爱好者快捷键
            var timeline = document.querySelectorAll('ul.thread');
            for (var i = 0, l = timeline.length; i < l; i++) {
                var qn = timeline[i].parentNode;
                if (qn.getAttribute('focuss') == null) {
                    var div = document.createElement("div");
                    div.className = "focusDiv";
                    div.setAttribute('focuss', i);
                    div.setAttribute('tabindex', '-1');
                    div.addEventListener("keydown", feedShortcutKey, null);
                    qn.insertBefore(div, timeline[i]);
                    div.appendChild(timeline[i]);
                }
            }

            var timeline = document.querySelectorAll('div.list-group-item');
            for (var i = 0, l = timeline.length; i < l; i++) {
                timeline[i].setAttribute('focuss', i);
                timeline[i].setAttribute('tabindex', '-1');
                timeline[i].addEventListener("keydown", feedShortcutKey, null);
            }
            //给引用的内容增加 role,解决引用的内容无法读出
            var q = d.querySelectorAll('blockquote');
            for (var i = 0; i < q.length; i++) { q[i].setAttribute('role', 'link'); }

            //楼层页快捷键
            var timeline = document.querySelectorAll('table.post_table,div.post_table');
            for (var i = 0, l = timeline.length - 1; i < l; i++) {
                var qn = timeline[i].parentNode;
                if (qn.getAttribute('focuss') == null) {
                    var div = document.createElement("div");
                    div.className = "focusDiv";
                    div.setAttribute('focuss', i);
                    div.setAttribute('tabindex', '-1');
                    div.addEventListener("keydown", fShortcutKey, null);
                    qn.insertBefore(div, timeline[i]);
                    div.appendChild(timeline[i]);
                }
            }
        }
        if (token == 'apk.qt06') {
            //删除网站 Chrome 下已有但无法使用的 Alt + X,避免和脚本冲突
            var access = d.querySelectorAll('[accesskey="x"]');
            for (var i = 0, l = access.length; i < l; i++) { access[i].removeAttribute('accesskey', '*'); }
            //优化安卓爱好者细节
            var divName = d.querySelectorAll('div.post_table');
            for (var i = 0; i < divName.length; i++) {
                divName[i].querySelector('div.sr-only').setAttribute('aria-hidden', 'true');
                var div = divName[i].querySelectorAll('div');
                for (var j = 0; j < div.length; j++) {
                    div[1].setAttribute('aria-hidden', 'true');
                }
            }
        }
        //爱盲
        if (token == 'bbs.amhl' && url.length < 30) {
            document.addEventListener("keydown", keyboardClick, null);
        }
        if (token == 'bbs.amhl') {
            var y = document.querySelectorAll('[accesskey="x"');
            for (var i = 0; i < y.length; i++) {
                y[i].removeAttribute('accesskey', '*'); y[i].classList.add('subject_link');
            }
        }
        if (token == 'bbs.amhl' && url.length > 30) {
            //帖子页
            var cc = document.querySelectorAll('div.bm_c');
            for (var j = 0; j < cc.length; j++) {
                var timeline = cc[j].querySelectorAll('tbody');
                for (var i = 0, l = timeline.length; i < l; i++) {
                    var qn = timeline[i].parentNode;
                    if (qn.getAttribute('focuss') == null) {
                        var div = document.createElement("div");
                        div.className = "focusDiv";
                        div.setAttribute('focuss', i);
                        div.setAttribute('tabindex', '-1');
                        div.addEventListener("keydown", feedShortcutKey, null);
                        qn.insertBefore(div, timeline[i]);
                        div.appendChild(timeline[i]);
                    }
                }
            }

            //楼层页
            var timeline = document.querySelectorAll('div.pct');
            for (var i = 0, l = timeline.length; i < l; i++) {
                var qn = timeline[i].parentNode;
                if (qn.getAttribute('focuss') == null) {
                    var div = document.createElement("div");
                    div.className = "focusDiv";
                    div.setAttribute('focuss', i);
                    div.setAttribute('tabindex', '0');
                    div.addEventListener("keydown", fShortcutKey, null);
                    qn.insertBefore(div, timeline[i]);
                    div.appendChild(timeline[i]);
                }
            }
        }
        //爱盲主站
        if (token == 'www.amhl') {
            var y = document.querySelectorAll('[accesskey="x"');
            for (var i = 0, l = y.length; i < l; i++) {
                y[i].removeAttribute('accesskey', '*'); y[i].classList.add('subject_link');
            }
            document.addEventListener("keydown", keyboardClick, null);
        }

    }
    function amo(processFunction) {
        var mcallback = function (records) {
            records.forEach(function (record) {
                if (record.type == 'childList' && record.addedNodes.length > 0) {
                    var newNodes = record.addedNodes;
                    for (var i = 0, len = newNodes.length; i < len; i++) {
                        if (newNodes[i].nodeType == 1) {
                            processFunction(newNodes[i]);
                        }
                    }
                }
            });
        };
        var mo = new MutationObserver(mcallback);
        mo.observe(document.body, { 'childList': true, 'subtree': true });
    }
})();

function feedShortcutKey(k) {
    k.stopPropagation();
    var feed = document.querySelectorAll('div[focuss]');
    for (var i = 0, l = feed.length; i < l; i++) {
        var focussValue = this.getAttribute('focuss'); var number = parseInt(focussValue);
        if (k.altKey && k.keyCode == 88) {
            if (number == l - 1) { feed[0].querySelector('a.subject_link').focus(); }
            else { feed[number + 1].querySelector('a.subject_link').focus(); }
        }
        if (k.altKey && k.shiftKey && k.keyCode == 88) {
            if (number == 0) { feed[l - 1].querySelector('a.subject_link').focus(); }
            else { feed[number - 1].querySelector('a.subject_link').focus(); }
        }
    }
    turnPage(k);
}

document.body.addEventListener("keydown", function (k) {
    var content = document.querySelectorAll('div[focuss]');
    for (var i = 0, l = content.length; i < l; i++) {
        if (k.altKey && k.shiftKey && k.keyCode == 88) {
            content[l - 1].focus();
            content[l - 1].querySelector('a.subject_link').focus();
        }
        if (k.altKey && k.keyCode == 88) {
            content[0].focus();
            content[0].querySelector('a.subject_link').focus();
        }
        if (k.altKey && k.shiftKey && k.keyCode == 88) {
            content[l - 1].focus();
            content[l - 1].querySelector('a.subject_link').focus();
        }
    }
    turnPage(k);
player(k);
}, null);


function fShortcutKey(k) {
    k.stopPropagation();
    var feed = document.querySelectorAll('div[focuss]');
    for (var i = 0, l = feed.length; i < l; i++) {
        var focussValue = this.getAttribute('focuss'); var number = parseInt(focussValue);
        if (k.altKey && k.keyCode == 88) {
            if (number == l - 1) { feed[0].focus(); }
            else { feed[number + 1].focus(); }
        }
        if (k.altKey && k.shiftKey && k.keyCode == 88) {
            if (number == 0) { feed[l - 1].focus(); }
            else { feed[number - 1].focus(); }
        }
        turnPage(k);
player(k);
    }
}

function turnPage(k) {
    var page = document.querySelectorAll('a');
    for (var i = 0, l = page.length; i < l; i++) {
        var name = page[i].innerText;
        if (k.altKey && k.keyCode == 50) {
            if (document.querySelector('a[id="pageup"]') !== null) {
                document.querySelector('a[id="pageup"]').focus();
            }
            else {
                if (name == '上一页') {
                    page[i].focus();
                }
            }
        }
        if (k.altKey && k.keyCode == 51) {
            if (name == '下一页') {
                page[i].focus();
            }
        }
        if (k.altKey && k.keyCode == 49) {
            if (name == '最新主题') {
                page[i].focus();
            }
        }
    }
}

w = -1;
function keyboardClick(k) {
    var a = document.querySelectorAll("a.subject_link");
    for (var i = 0, l = a.length; i < l; i++) {
        if (k.altKey && k.shiftKey && k.keyCode == 88) {
            if (w <= 0) {
                w = l - 1;
                a[l - 1].focus();
                break;
            }
            else {
                w--
                a[w].focus(); break;
            }
        }

        if (k.altKey && k.keyCode == 88) {
            if (w >= l - 1) {
                w = 0;
                a[0].focus();
                break;
            }
            else {
                w++
                a[w].focus(); break;
            }
        }
    }
}

var audio = new Audio("http://veg.ink/music/001.mp3");
audio.volume = 1;
audio.play();
//播放器
(function () {
setTimeout(function(){
var aud = document.querySelector('div.subject_link').querySelector('audio');
if (aud !== null) {
    var voiceUrl = aud.getAttribute('src');
}
if (aud == null) {
    var voiceUrl = document.querySelector('param[name="Filename"]').getAttribute('value');
}
var audios = document.querySelector('.audio-audio');
if (voiceUrl !== null && audios == null) {
    var audio = document.createElement("audio");
    audio.className = "audioCtrl";
    audio.src = voiceUrl;
    audio.volume = 0.5;
    audio.loop = "true";
    audio.play();
    document.body.appendChild(audio);
}
},800);})();

function player(k) {
var audio = document.querySelector('audio.audioCtrl'); {
if (k.keyCode == 27) {
if (audio.paused !== true) {
audio.pause();
}
else {
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;
} }
}
}