accessibility_盲网快捷键

可访问性优化

目前为 2018-04-20 提交的版本,查看 最新版本

// ==UserScript==
// @name         accessibility_盲网快捷键
// @namespace    https://www.zhihu.com/people/yin-xiao-bo-11
// @version      0.1.3.6
// @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; i < l; i++) {
var qn = timeline[i].parentNode;
var name = timeline[i].innerText;
if (qn.getAttribute('focuss') == null) {
var div = document.createElement("div");
div.className = "focusDiv";
div.setAttribute('focuss', i);
div.setAttribute('tabindex', '0');
div.setAttribute('aria-label', name);
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 styles = timeline[i].querySelector('style')
if (styles !== null) {
timeline[i].removeChild(styles);
}
var qn = timeline[i].parentNode;
var name = timeline[i].innerText;

if (qn.getAttribute('focuss') == null) {
var div = document.createElement("div");
div.className = "focusDiv";
div.setAttribute('focuss', i);
div.setAttribute('aria-label', name);
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) {
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) {
k.stopPropagation();
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) {
k.stopPropagation();
if (number == 0) { feed[l - 1].querySelector('a.subject_link').focus(); }
else { feed[number - 1].querySelector('a.subject_link').focus(); }
}
} }

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();
return false;
}
if (k.altKey && k.keyCode == 88) {
content[0].focus();
content[0].querySelector('a.subject_link').focus();
return false;
}
}
turnPage(k);
player(k);
}, null);


function fShortcutKey(k) {
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) {
k.stopPropagation();
if (number == l - 1) { feed[0].focus(); }
else { feed[number + 1].focus(); }
}
if (k.altKey && k.shiftKey && k.keyCode == 88) {
k.stopPropagation();
if (number == 0) { feed[l - 1].focus(); }
else { feed[number - 1].focus(); }
}
} }

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 == '最新主题' || 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') || document.querySelector('div.container-fluid').querySelector('audio'); {
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;
}
}
}
}