// ==UserScript==
// @name 问卷星无障碍优化
// @namespace https://accjs.org/
// @version 0.1
// @description 问卷星无障碍优化脚本
// @author 杨永全
// @match https://*.wjx.com/*
// @match https://*.wjx.cn/*
// @match https://*.wjx.top/*
// @grant none
// ==/UserScript==
(function() {
cproc();
aamo(aproc);
document.addEventListener('keydown', function(e) {
let t = e.target || null;
if(e.keyCode == 32 || e.keyCode == 13) {
if(t.matches('.accjs-click')) {
t.click();
if(t.matches('textarea[province]')) {
setTimeout(function() {
var iframe = document.querySelector('iframe');
if(iframe != null) {
var select = iframe.contentDocument.querySelector('select');
if(select != null) {
select.focus();
}
}
}, 300);
}
}
}
}, null);
function aproc(records) {
document.querySelectorAll('.jqRadio, .jqCheckbox').forEach(function(el) {
let checked = el.matches('.jqChecked');
attr(el, 'aria-checked', checked);
});
}
function cproc() {
let titles = document.querySelectorAll('h1, .surveydescription, .div_title_cut_question, .div_title_question_all');
titles.forEach(function(el) {
let label = el.innerText;
attr(el, 'aria-label', label);
attr(el, 'tabindex', '0');
let pe = el.parentNode;
if(pe != null) {
pe.querySelectorAll('textarea, input').forEach(function(el) {
attr(el, 'aria-label', label);
});
}
});
if(titles.length > 0) {
titles[0].focus();
}
document.querySelectorAll('.jqRadio, .jqCheckbox').forEach(function(el) {
let label = el.parentNode.innerText || '';
attr(el, 'aria-label', label);
attr(el, 'aria-checked', 'false');
addClass(el, 'accjs-click');
let pe = el.parentNode;
if(pe != null) {
pe.querySelectorAll('label').forEach(function(el) {
attr(el, 'aria-hidden', 'true');
});
pe.querySelectorAll('input').forEach(function(el) {
attr(el, 'aria-label', label);
});
}
});
document.querySelectorAll('.jqRadio').forEach(function(el) {
attr(el, 'role', 'radio');
attr(el, 'tabindex', '-1');
});
document.querySelectorAll('.jqCheckbox').forEach(function(el) {
attr(el, 'role', 'checkbox');
});
document.querySelectorAll('.div_question').forEach(function(el) {
let radios = el.querySelectorAll('.jqRadio');
if(radios.length > 0) {
radios[0].setAttribute('tabindex', '0');
}
});
document.querySelectorAll('#divProgressBar').forEach(function(el) {
attr(el, 'tabindex', '0');
//attr(el, 'role', 'progressbar');
});
document.querySelectorAll('textarea[province]').forEach(function(el) {
attr(el, 'title', '按空格键或回车键打开地区选择对话框');
el.removeAttribute('aria-label');
addClass(el, 'accjs-click');
});
//end cproc function
}
function attr(el, key, val) {
el.setAttribute(key, val);
}
function addClass(el, classes) {
classes.split(' ').forEach(function(className) {
el.classList.add(className);
});
}
function aamo(proc) {
var mo = new MutationObserver((records) => {
proc(records);
});
mo.observe(document.body, {
'attributes': true,
//'attributeOldValue': true,
'subtree': true,
'attributeFilter': ['class']
});
return mo;
}
function acmo(proc) {
let mo = new MutationObserver((records) => {
proc();
});
mo.observe(document.body, {
'childList': true,
'subtree': true
});
return mo;
}
})();