ASP无障碍设计:视障开发者高效调试代码
|
去年四月,我蹲在三号机房调试ASP.NET Core那套老UI层,听键盘声听出第七个tabindex错位——不是靠眼,是靠Ctrl+F5之后那个卡顿的节奏不对。屏保一亮,VoiceOver就吞掉整个控件树的role,但你猜怎么着?这回它没吞,反把错误堆栈里那个NullReferenceException的行号念得比VS状态栏还清楚。我原以为又是JAWS跟IIS版本打架,结果扒开web.config一看,就加了一行``,连注释都没留。优胜劣汰——真不是修辞,是血淋淋的淘汰机制:你代码里留三个没label的button,它不报错,它直接让读屏跳过;你render了但没设aria-live,它就不推通知;它不跟你讲道理,只用静音告诉你:这儿没你事了。 那天下午雨下得发闷,空调外机在窗外咳了整四十分钟,像台将死的柴油泵。隔壁小张叼着半截冷掉的肉包进来,把U盘往我键盘上一拍,说“林工你看看这个盲文终端对接的脚本”,他袖口沾着芝麻酱,蹭在我显示器右下角那块擦不净的油渍上。我接过来扫一眼,就两行:一行`Console.WriteLine("OK")`,一行`throw new Exception("nope")`——中间缺了`if (IsScreenReaderActive)`。我手指悬在F5上没按,光听他嚼包子的声音,咯吱、咯吱、咯吱,三声,然后他接了个电话,说的是“王处您稍等我挂了调试一下”。 最绝的是表单验证那段。正常人改model绑定,我们得先绕到`IAccessibleProvider`接口里去补`GetStateText`的fallback逻辑——上个月我就栽在这儿,补了十七次,每次都是IE11下state变了但text不更新。可四月这次,我把`[Display(Name = "密码确认")]`换成`[Display(Name = "密码确认(请逐字确认)")]`,嘿,读屏居然自动降速0.3倍。我不信,试了三遍,连读三次“请逐字确认”,语速纹丝不动。这玩意儿自己学人说话?我说不准。但它敢动,我反而不敢动了——删掉括号试试?立刻恢复默认语速,像被抽了一鞭子。这个我敢打包票:不是配置缓存,我清过五次bin目录,重编译七遍,现象纹丝不变。 桌上的外卖盒盖子翘着,酸辣粉汤都凉透了,浮一层灰白油花。我伸手想合盖,摸到边缘黏糊糊的,应该是谁之前撕胶带留的残胶。顺手拿纸巾擦,擦完发现纸巾上印着“XX银行客户满意度回访”字样,字体还是黑体加粗。真讽刺,一个连button文字都懒得读全的系统,倒有闲心给银行打印这种玩意儿。 前两天翻旧日志,发现2019年有个同事在IIS日志里狂打`AccessibilityMode=Lenient`,打了八百多行,最后在第842行写“算了,用jQuery手动注入aria-label”。现在看,他不是懒,是懂——Lenient模式就是让服务器装瞎,假装看不见屏幕阅读器正在监听,结果所有动态内容全变哑巴。而strict?它逼你当场重构。不是“建议加label”,是“不加就断链”;不是“考虑兼容性”,是“render完立刻校验role匹配度”。这不是设计,是刑讯逼供。所以我说优胜劣汰——活下来的,要么是API层早就在controller里塞好了`ViewData["aria_describedby"]`,要么是连``的name属性都手写成驼峰加空格的狠人。中间派?呵,上周五测试组发来的buglist里,三百七十二条,二百六十五条标着“仅读屏复现”,剩下六条写着“已无法定位原开发者”。
文章配图,仅供参考 对了,王处后来又来过一次,没带包子,拎着个塑料袋,里面装着三块磁吸式盲文标签,边角都磨毛了。他说他们信息科新配的触觉反馈键盘刚到,问能不能把ASP生成的页面结构实时映射成Braille ASCII流。我没接话,把桌上那盒凉透的酸辣粉往右推了十厘米——正好挡住他视线里我的屏幕。这事我暂时不想碰。Braille ASCII不是难点,难点是IIS线程池根本不会等你读完十六个点阵才返回HTTP头。再说,我昨天才看见运维日志里一行警告:“Warning: accessibility mode override detected in web.config — auto-disabled after 3 failed attempts.” 它已经开始自愈了,比我快。 所以我打算下周把所有`@Html.TextBoxFor`批量替换成`@Html.CustomAccessibleTextBoxFor`,自己写的那个。不为别的,就为它输出时会检查`ViewContext.HttpContext.Request.Headers["User-Agent"]`里有没有NVDA、JAWS或TalkBack字样,有就加一套冗余``包裹数字键区——哪怕只是让盲文终端多抖两次。至于为什么不用TagHelper统一拦截?嗯……我原以为那样更干净,结果实测发现TagHelper里`WriteTo`方法在异步流里会丢掉两个点阵位。具体哪两位?我说不准。但我知道,抖错位置的盲文,比不抖还糟。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


鸿蒙开发工程师跨界解构ASP:零基础建企业级Web应用
无障碍设计:从第一行代码起的尊重
ASP进阶实战:数据安全工程师的站长成长路
无障碍设计失灵?动态跨界整合破局
ASP进阶实战:系统工程师高效开发指南
MySQL事务控制无障碍设计实战指南