/ Title: TV框架开发指南 Description: 基于 JavaScript 的 TV 框架开发指南 Sort: 6 /

准备工作

必须定义的 CSS 样式

如果不指定这两个样式,用户操作时无法收到反馈,极影响用户体验

  • .focus{} 是按下遥控器方向键,焦点移入某元素的样式
  • .active{} 是按下遥控器确定键,当前元素的样式

必须定义的 HTML 属性

tabindex,给能够获取焦点的 HTML 元素加此属性,当前不支持元素嵌套

1.自动排序:程序根据元素的位置,自动寻找下一个焦点元素

  1. <div tabindex>元素1</div>
  2. <div tabindex>元素2</div>
  3. <div tabindex>元素3</div>

2.指定排序:程序按照 tabindex 的值大小,寻找下一个焦点元素,tabindex 的值必须是正整数

  1. <div tabindex="1">元素1</div>
  2. <div tabindex="2">元素2</div>
  3. <div tabindex="3">元素3</div>

名词解释

  • 焦点元素:能够获取焦点的元素,也就是带有 tabindex 属性的元素
  • scope容器:每个页面需要规定一个元素作为容器,容器内所有带有 tabindex 属性的元素,按下遥控器上、下、左、右时可以获取焦点,每个页面只能有一个scope容器

框架使用

不需要额外引入 JS 文件,直接在 apiready 函数中初始化。

  1. <script type="text/javascript">
  2. apiready = function(){
  3. var tv = new TV();
  4. tv.init({
  5. scope: '#menu',
  6. firstFocus: true
  7. });
  8. };
  9. </script>

方法

.init(options)

  • 描述:TV框架初始化
  • 用法:init(options)
  • 参数:options (类型:Object)
  • 示例:
    1. var tv = new TV();
    2. tv.init({
    3. scope: '#menu',
    4. firstFocus: true
    5. });

options 参数详解

  1. {
  2. scope: '#id', //必传参数,类型:CSS 选择器,建议传 id 选择器。scope 是页面内可以获取焦点的所有元素的最外层容器,一个页面只能有一个容器。
  3. sortByTabIndex: false, //可选参数,类型:Boolean,默认值:false。是否按 tabindex 值大小寻找元素
  4. firstFocus: false, //可选参数,类型:Boolean,默认值:false。首个焦点元素是否需要样式
  5. lastFocus: false, //可选参数,类型:Boolean,默认值:false。是否记录最后一个焦点元素的状态,适用场景:TAB 标签切换,内容区域的焦点需要记录
  6. focusIn: function(focused){}, //可选参数,类型:Function,focused:Boolean 型。当前的 Frame 或 Window 获取焦点时触发
  7. focusOut: function(focused){}, //可选参数,类型:Function,focused:Boolean 型。当前的 Frame 或 Window 失去焦点时触发
  8. focus: function(){}, //可选参数,类型:Function。某个元素获取焦点时触发
  9. active: function(){}, //可选参数,类型:Function。在某个元素上按下遥控器确认键时触发
  10. up: function(curEl,targetEl){}, //可选参数,类型:Function。curEl:当前元素,targetEl:下一个可获取焦点的元素。按下遥控器上键时触发
  11. down: function(curEl,targetEl){}, //可选参数,类型:Function,参数同 up 。按下遥控器下键时触发
  12. left: function(curEl,targetEl){}, //可选参数,类型:Function,参数同 up 。按下遥控器左键时触发
  13. right: function(curEl,targetEl){}, //可选参数,类型:Function,参数同 up 。按下遥控器右键时触发
  14. topmost: function(){}, //可选参数,类型:Function。到达最顶部焦点元素时触发
  15. bottommost: function(){}, //可选参数,类型:Function。到达最底部焦点元素时触发
  16. leftmost: function(){}, //可选参数,类型:Function。到达最左侧焦点元素时触发
  17. rightmost: function(){}, //可选参数,类型:Function。到达最右侧焦点元素时触发
  18. reachScopeTop: function(targetEl){}, //可选参数,类型:Function,targetEl:下一个可获取焦点的元素。到达scope容器的最顶部时触发
  19. reachScopeBottom: function(targetEl){}, //可选参数,类型:Function,targetEl:下一个可获取焦点的元素。到达scope容器的最底部时触发
  20. reachScopeLeft: function(targetEl, viewportPos){}, //可选参数,类型:Function,targetEl:下一个可获取焦点的元素,viewportPos:scope容器元素。到达scope容器的最左侧时触发
  21. reachScopeRight: function(targetEl, viewportPos){}, //可选参数,类型:Function,targetEl:下一个可获取焦点的元素,viewportPos:scope容器元素。到达scope容器的最右侧时触发
  22. }

焦点元素

上面方法中的 curEltargetEl 参数均为焦点元素对象,类型:Object,它们带有一些属性

  1. {
  2. 'uz-element-id': 'eid-0', //每个可获取焦点的元素均会有一个唯一的元素id,框架自动分配,可通过此属性找到元素。示例:<div tabindex uz-element-id="eid-1"></div>
  3. 'element': Element, //DOM 元素引用
  4. 'x': 0, //DOM 元素左上角的 x 轴坐标
  5. 'y': 0, //DOM 元素左上角的 y 轴坐标
  6. 'w': 100, //DOM 元素的宽度
  7. 'h': 100 //DOM 元素的高度
  8. }

可视区域元素

上面方法中的 viewportPos 代表可视区域对象,类型:Object,根据 element.getBoundingClientRect() 算出的属性值

  1. {
  2. top: 0, //元素距离可视区域顶部的距离
  3. bottom: 3077, //元素距离可视区域底部的距离
  4. left: 0, //元素距离可视区域左侧的距离
  5. right: 1349 //元素距离可视区域右侧的距离
  6. }

.refresh()

  • 描述:页面布局结构或样式改变,以及AJAX请求的新数据插入页面时,重新计算焦点元素
  • 用法:refresh()
  • 示例:
    1. var tv = new TV();
    2. tv.refresh();

api.requestFocus({params})

  • 描述:强制将焦点切换到某个 frame 或者 window
  • params 参数:

    name:frame的名字,为空或不传则默认为调用该接口的 frame 或 window, 类型:字符型,默认值:空

  • 示例:
    1. apiready = function(){
    2. api.requestFocus({
    3. name: 'name'
    4. });
    5. };