盲人站長(zhǎng)深?lèi)和唇^的onfocus=”this.blur()”

在談到讀屏軟件操作頁(yè)面時(shí),他對(duì)我們前端的同學(xué)特別的強(qiáng)調(diào):他最深?lèi)和唇^的就是頁(yè)面鏈接上有 onfocus=”this.blur()” 這句代碼,這從何說(shuō)起呢?
(圖一)
各位同學(xué),看到這句代碼有沒(méi)有覺(jué)得眼熟,對(duì)的,你懂的,我們常用它來(lái)去除鏈接取得焦點(diǎn)時(shí)外圍出現(xiàn)的虛線(xiàn)框(如上圖一),google一下,前面幾十頁(yè)談的都是這個(gè)去除虛線(xiàn)框的技巧。但我們也許以前從未想過(guò):我們的這行代碼給盲人用戶(hù)們帶來(lái)了巨大的困擾:這中斷了盲人用戶(hù)的Tab鍵路徑,導(dǎo)致Tab光標(biāo)無(wú)法聚焦頁(yè)面的下一個(gè)控制器(鏈接、表單域、object、image map等)。測(cè)試如下:
<body>
<a href="#" >第一個(gè)鏈接</a>
<a href="#" >第二個(gè)鏈接</a>
<a href="#" onfocus="this.blur();">第三個(gè)鏈接</a>
<a href="#" >第四個(gè)鏈接</a>
<a href="#" >第五個(gè)鏈接</a>
<a href="#" >第六個(gè)鏈接</a>
</body>
按下Tab鍵,第一和第二個(gè)鏈接都可以正常獲取焦點(diǎn),繼續(xù)Tab到第三個(gè)鏈接時(shí),悲劇出現(xiàn)了:此時(shí)焦點(diǎn)會(huì)回到第一個(gè)鏈接,而無(wú)法Focus到第四個(gè)鏈接,原因是當(dāng)Focus到第三個(gè)鏈接時(shí),onfocus=”this.blur()” 事件處理強(qiáng)制觸發(fā)了失焦,焦點(diǎn)重新回到文檔的最開(kāi)始。于是不停按Tab的結(jié)果就是焦點(diǎn)在前面三個(gè)鏈接輪流轉(zhuǎn),后面的內(nèi)容通過(guò)Tab鍵無(wú)法訪問(wèn)[1]。

那么,有更好的方式嗎?從根源上看,加onfocus=”this.blur()”是為了去除鏈接獲取焦點(diǎn)后外圍的虛線(xiàn)框(當(dāng)然chrome、safari、opera下的focus效果各異,這里姑且就這么叫吧 )。W3C關(guān)于Outline的文章里說(shuō)明這個(gè)虛線(xiàn)框用來(lái)告訴用戶(hù)當(dāng)前頁(yè)面獲取焦點(diǎn)的元素。我覺(jué)得,虛線(xiàn)框的存在有它的合理性,但有時(shí)你也許無(wú)法回避某些”視覺(jué)潔癖”需求(如圖二:虛線(xiàn)框使“商品”背景和下面的紅色色塊分隔開(kāi)了),以下總結(jié)了去掉虛線(xiàn)框的幾種常用方法:
去除虛線(xiàn)框的方法 | 優(yōu)劣 | 兼容性 | 是否中斷tab |
---|---|---|---|
<a href=”#” onfocus=”this.blur()”>this blur</a> | 鏈接聚焦觸發(fā)時(shí)失去焦點(diǎn),js和html耦合在一起 | 沒(méi)有兼容性問(wèn)題 | 是 |
a:focus {outline:none}或 a{outline:none} |
outline由css2.1引入,去除虛線(xiàn)框視覺(jué)上的問(wèn)題正是css的職責(zé) | ie6/ie7不支持,ie8+/ff /safari/opera[2]支持 | 否 |
<a href=”#” hidefocus=”true” >hidefocus</a> | 該屬性是ie的私有屬性[3] | ie5+支持 | 否 |
a { noFocusLine: expression(this.onFocus = this.blur())} | 可批量處理,但expression的性能問(wèn)題不能忽視 | expression ie6/7支持,ie8+、非ie不支持 | 是 |
綜合以上,去除鏈接虛線(xiàn)框的推薦方法是:ie下用hidefocus屬性,ff/chorme/opera/safari下用outline:none。即:
<a href="#" hidefocus="true" >鏈接</a>
a:focus {
outline:none;
}
楊永全同學(xué)無(wú)奈地說(shuō),如果頁(yè)面因?yàn)閛nfocus="this.blur()"導(dǎo)致tab無(wú)法訪問(wèn)頁(yè)面全部?jī)?nèi)容,爭(zhēng)渡讀屏軟件在讀取頁(yè)面之前會(huì)強(qiáng)制過(guò)濾掉這個(gè)屬性,但是如果用戶(hù)是在js里面動(dòng)態(tài)觸發(fā)this.blur(),讀屏軟件又要出新招來(lái)克制了。這無(wú)疑增加了讀屏軟件的開(kāi)發(fā)工作量,為了讓盲人用戶(hù)們能更順暢的訪問(wèn)我們的網(wǎng)站,盡量避免使用onfocus="this.blur()"哦。
注釋
[1]Safari默認(rèn)情況下,按tab鍵是不會(huì)focus鏈接的,但會(huì)focus表單域,在偏好設(shè)置-高級(jí)勾選“按下tab以高亮顯示網(wǎng)頁(yè)上的每一項(xiàng)”可開(kāi)啟該功能。Opera比較特殊,它通過(guò)shift+上下左右方向鍵可以向上下左右focus頁(yè)面焦點(diǎn)。
[2]在Opera下點(diǎn)擊鏈接(focus和active狀態(tài))時(shí)都不會(huì)出現(xiàn)所謂的虛線(xiàn)框,所以 Opera下鏈接的虛線(xiàn)框問(wèn)題可以不計(jì)。 Opera 通過(guò)shift+上下左右鍵產(chǎn)生的線(xiàn)框通過(guò)outline:none并不能去除,但是Opera支持outline這個(gè)屬性。
[3]hidefocus屬性是ie的私有屬性,雖然hidefocus屬性有true or false兩個(gè)值,但測(cè)試結(jié)果是ie5-ie9不管其值為true or false, 只要添加hidefocus屬性,該鏈接都會(huì)失去虛線(xiàn)框。
相關(guān)文章
15 個(gè)為編程初學(xué)者準(zhǔn)備的網(wǎng)站(都是國(guó)外的一些網(wǎng)站)
今天的文章,我們將分享15個(gè)可以學(xué)習(xí)編程的網(wǎng)站,這些網(wǎng)站上提供了很多編程教程,圖書(shū)以及編程練習(xí),希望對(duì)你有用2024-11-02web開(kāi)發(fā)中的長(zhǎng)度單位小結(jié)
這篇文章主要介紹了web開(kāi)發(fā)中的長(zhǎng)度單位主要包括px,pt,em等,需要的朋友可以參考下2023-08-06網(wǎng)頁(yè)前端開(kāi)發(fā)的一些尺寸單位(px,rem單位)
px單位是絕對(duì)單位,一般用于pc端網(wǎng)頁(yè)開(kāi)發(fā),因?yàn)槭墙^對(duì)單位所以在移動(dòng)端上的使用體驗(yàn)并不是很好,rem它是描述相對(duì)于當(dāng)前根元素字體尺寸,是相對(duì)單位,它可以根據(jù)根元素的變換而2023-08-06WEB前端優(yōu)化必備js/css壓縮工具YUI-compressor詳解與集成用法
壓縮工具層次不窮,各有優(yōu)點(diǎn),選擇適合的壓縮工具為將來(lái)做項(xiàng)目開(kāi)發(fā)使用是一件很重要的事情!!在這介紹YUI-compressor,需要的朋友可以參考下2023-06-21html,css,javascript是怎樣變成頁(yè)面的
瀏覽器是多進(jìn)程的,有瀏覽器主進(jìn)程,網(wǎng)絡(luò)進(jìn)程,渲染進(jìn)程,插件進(jìn)程等,在將html,css,javascript解析成一個(gè)頁(yè)面的時(shí)候,就需要多個(gè)進(jìn)程的分工合作2023-05-01- 本文為大家整理了常用的文件對(duì)應(yīng)的MIME類(lèi)型,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-25
postman中form-data、x-www-form-urlencoded、raw、binary的區(qū)別介紹
這篇文章介紹了postman中form-data、x-www-form-urlencoded、raw、binary的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-28網(wǎng)頁(yè)中使用Unicode字符的介紹(&#,\u等)
國(guó)際組織制定了可以容納世界上所有文字和符號(hào)的字符編碼方案,稱(chēng)為Unicode,是通用字符集Universal Character Set的縮寫(xiě),用以滿(mǎn)足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求2021-11-27前端實(shí)現(xiàn)字符串GBK與GB2312的編解碼(小結(jié))
這篇文章主要介紹了前端實(shí)現(xiàn)字符串GBK與GB2312的編解碼(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-12-02告別硬編碼讓你的前端表格自動(dòng)計(jì)算的實(shí)例代碼
這篇文章主要介紹了告別硬編碼讓你的前端表格自動(dòng)計(jì)算,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-27