按键 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 获得焦点并滚屏。
触发顺序为:
tab - > scroll -> focus
先滚屏再使元素获得焦点
触发顺序为
tab -> focus -> scroll
既然 ie9 都和 ie6,7,8 不一样,那么标准应该是
tab -> focus -> scroll
先获得焦点再滚屏,不过具体规范出处未知。
ps:
如果设置 tabIndex 为 -1,根据规范该元素一定能获得焦点,并且不能被 tab 顺序聚焦机制选中。
但是在 ie6 中,该元素仍然是能被 tab 选到。
如果设置 tabIndex 为 0,该元素一定能获得焦点,焦点顺序和该元素在dom节点中的顺序对应(不完全相同)。
var attr = elem.getAttributeNode("tabindex"); return attr ? attr.specified : false;
return elem.tabIndex;
elem.tabIndex=1;
由于 tabindex 属于 html 属性,则最终生成 html :
<x tabindex='1' ></x>
和设置 setAttribute 一样效果,不过直接用 setAttribute 的话会有很多麻烦 。
element.removeAttribute("tabindex"); element.removeAttribute("tabIndex");
两个都要写,后一个主要为了 ie6,7 ,ie6,7不能区分 content value 与 dom value .