?按键 tab 在 可访问性 中具有重要作用,会使得下一个可聚焦元素 获得焦点,若将要获得焦点的元素在当前屏幕之外,还会引起浏览器滚屏(即触发 scroll 事件),但是对于是先触发将要获得焦点元素的 focus 事件,还是先触发 scroll ,ie 与 标准浏览器有分歧:
?
场景:
?
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br> <a id='after' href='#'>after</a>
?
打开该页面,点击空白区域后,按下 tab 键,则会使得 after 获得焦点并滚屏。
?
demo
?
差异:
?
ie 6,7,8
?
触发顺序为:
?
tab - >? scroll -> focus
?
先滚屏再使元素获得焦点
?
?
ie9,firefox,chrome
?
触发顺序为
?
tab -> focus -> scroll
?
标准:
?
既然 ie9 都和 ie6,7,8 不一样,那么标准应该是
?
tab -> focus -> scroll
?
先获得焦点再滚屏,不过具体规范出处未知。
?
ps:
?
如果设置 tabIndex 为 -1,根据规范该元素一定能获得焦点,并且不能被 tab 顺序聚焦机制选中。
但是在 ie6 中,该元素仍然是能被 tab 选到。
?
如果设置 tabIndex 为 0,该元素一定能获得焦点,焦点顺序和该元素在dom节点中的顺序对应(不完全相同)。
?
ps2 : 使用 javascript 操作 tabIndex
?
判断是否设置 tabindex :
?
var attr = elem.getAttributeNode("tabindex"); return attr ? attr.specified : false;
?
读取 elem 设置的 tabindex :
?
return elem.tabIndex;
?
设置 tabindex :
?
elem.tabIndex=1;
?
由于 tabindex 属于 html 属性,则最终生成 html :
?
<x tabindex='1' ></x>
?
和设置 setAttribute 一样效果,不过直接用 setAttribute 的话会有很多麻烦 。
?
清除 tabindex 属性 :
?
element.removeAttribute("tabindex"); element.removeAttribute("tabIndex");?
两个都要写,后一个主要为了 ie6,7 ,ie6,7不能区分 content value 与 dom value .