您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
可访问性优化
当前为
// ==UserScript== // @name accessibility_盲网快捷键 // @namespace https://www.zhihu.com/people/yin-xiao-bo-11 // @version 0.1.3.7 // @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 ax=d.querySelectorAll('[accesskey="x"]'); for (var i=0; i<ax.length; i++) { ax[i].removeAttribute('accesskey','*'); } //争渡网和安卓爱好者快捷键 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') { //优化安卓爱好者细节 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; } } } }