热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于前端:原生TV端焦点处理框架-focusjs-V106-前端-JS

这个框架使用十分的简略,简略应用就3步,实用于用原生写TV端需要的前端,即便素来没开发过TV端的看完根本应用也能够把握,十分好用!github链接:[链接](觉

这个框架使用十分的简略,简略应用就3步,实用于用原生写TV端需要的前端,即便素来没开发过TV端的看完根本应用也能够把握,十分好用!
github链接:https://github.com/simpleRobort/TV-Focus.js (感觉不错的麻烦github给个star,万分感激)

I.根本应用

1.事后写好页面,保障你所有可能获取焦点的dom元素领有一个对立结尾的id 个别为 “item?”,其中?为数字,从0开始,上不封顶

        
这是第个0dom
这是第个1dom
这是第个2dom
这是第个3dom
这是第个4dom
这是第个5dom

对应css:

        .focus {
            border: 2px solid #0f0f0f; /*这里就是获取焦点的实现原理了,Focus.js会给获取焦点的元素增加一个名字叫做 focus 的class类*/
        }

2.从源码里下载focus.js(点击下载),在你的html页面中引入

3.在引入之后创立一个script标签,new一个FOCUS对象并且传入参数

到这里最简略的焦点挪动曾经被增加好了,你就能够关上页面看成果了

根本应用测试地址

II.进阶应用

1.应用后辈选择器显示暗藏图片与dom元素

根本应用里咱们只是简略的给focus增加了一个边框,十分的简便,然而当咱们须要通过焦点与否显示不同的图片的时候,只是简略的给focus增加边框并不够用,这时候就须要css的后辈选择器了

css:

.dom .select {
  position: absolute; /*须要增加定位,不然会被未选中显示的内容挤下去*/
  display: none; /*未被选中时暗藏选中才显示的内容*/
}

.dom .unselect {
  display: block; /*未获取焦点时显示没被选中须要显示的内容*/
}

.focus .select {
  display: block; /*获取焦点时显示被选中的须要显示的内容*/
}

.focus .unselect {
  visibility: hidden; /*获取焦点时暗藏未被选中须要显示的内容*/
}

html:


js:

   var vm = new FOCUS({
        focusId: 'item3', // 页面首先获取焦点的dom元素的Id
        event: {
            keyOkEvent: function (focusId) {
                console.log("点击了确认键,以后取得焦点的索引为:" + focusId)
                switch (focusId) {
                    case 0:

                        break
                }
            },
            keyBackEvent: function (focusId) {
                console.log("点击了返回键,以后取得焦点的索引为:" + focusId)
                switch (focusId) {
                    case 6:
                    case 7:

                        break
                }
            }
        }
    })
应用后辈选择器示例地址

2.应用强制焦点变换 (forceMove)

实用的场景个别有两个:

1.你须要这个元素按某一个方向键不切换焦点或者切换到本人想要的焦点(哪怕隔了一座山哈哈)

2.你的ui设计稿十分的不法则(焦点默认的逻辑无奈满足需要,焦点默认挪动的逻辑是以dom的宽高地位发射一道射线,第一个触碰到的dom元素就会成为下一个焦点)

显然没有别的元素的话,这个两个元素无奈互相跳转,有人问我为什么不把断定范畴改大一点,我也试过,天然是解决了,然而有更多的问题呈现了,我这就不一一举例了哈哈,
回到正题,应用办法很简略,只须要在new FOCUS传入的对象里新增一个属性focusMove即可

var vm = new FOCUS({
            focusId: 'item3',
            forceMove: {
                // 须要被强制的焦点id:[上,左,下,右]
                item0: [-1,-1,"item1",-1],
                item1: ["item0",-1,-1,-1],
            }
        })

forceMove也是一个对象,须要传入属性,属性值为一个数组,顺次为方向键上左下右,参数有三种取值,如下

取值 形容
-1 不做解决,随框架判断逻辑主动切换焦点
-2 禁止挪动,即便对应的方向有焦点
其余dom的id 强制挪动到对应的dom

3.事件处理 (event)

tv端除了上下左右方向键与数字键,还有其余的事件,这里也提供了api

 var vm = new FOCUS({
        focusId: 'item3',
        event: {
            keyOkEvent: function (focusId) {
                console.log("点击了确认键,以后取得焦点的索引为:" + focusId)
                switch (focusId) {
                    case 0:

                        break
                }
            },
            changeIndexBeforeFind: function (dir,focusId) {
                // 两个传参(dir代表方向:上左下右顺次为0123,以后焦点id)
                // Focus会在主动寻找下一个焦点前触发这个事件,如果这个函数返回了一个指定索引
                // 那么框架就不会浪费时间去寻找下一个焦点,间接应用你返回的索引
                // 例:
                if (dir == 3 && focusId == 0) {
                    return 2
                } 
                // 当在焦点索引为0的dom按下 右方向键,返回一个索引2,框架会放弃计算
                // 间接让索引为2的获取焦点
            },
            changeIndexAfterFind: function (dir,focusId,nextId) {
                 // 三个传参(前两个同上,nextId为计算实现的焦点,如果没有适合的焦点就会返回-1)
                 // Focus会在寻找完焦点后触发这个事件,如果这个函数返回了一个指定索引
                 // 那么框架就摈弃原本应该成为焦点的nextId,间接应用你返回的索引
           
             },
            
        }
    })
事件名称(都是函数,如上) 形容
keyNumberEvent 遥控器数字点击,有两个传参:(对应的数字,以后获取焦点的索引)
keyOkEvent 遥控器确认键,有一个传参(以后获取焦点的索引)
keyBackEvent 遥控器返回键,有一个传参(以后获取焦点的索引)
focusEvent 获取焦点后事件,有一个传参(以后获取焦点的索引)
unfocusEvent 失去焦点后事件,有一个传参(失去焦点的索引)
darkFocusEvent 获取暗焦点后事件,有一个传参(失去焦点的索引)
undarkFocusEvent 失去暗焦点后事件,有一个传参(失去焦点的索引)
changeIndexBeforeFind 按任意方向键后触发,详情见上图
changeIndexAfterFind 按任意方向键后触发,详情见上图

4.二级以上页面 (pageState)

当页面有若干个焦点是在触发某一个事件才可能被获取焦点的,在事件未触发时不应该被获取焦点,如果通过下面的强制事件频繁的增加-2,那可太麻烦了,这时候就pageState就呈现了

应用办法:

 var vm = new FOCUS({
        pageState: {
                // 非凡焦点:页面索引(默认为1)
                item4: 2,
                item5: 2
            },
    })

5.办法 (methods)

为了尽量使页面的外围代码保留在FOCUS传参内,增加了相似vue的methods来不便代码治理

应用办法:

 var vm = new FOCUS({
        methods: {
                    handleTest: function () {
                        console.log("你点击了methods")
                    }
                },
         event: {
                  keyOkEvent: function (focusId) {
                      this.handleTest()
                  }
              }
    })

传参时传入一个methods对象,用来保留办法,this指向Focus,也通过this.办法名来调用methods外部办法

methods示例地址

5.暗焦点 (darkFocus)

tv端常常会有一个需要,页面上会有多个焦点,比如说一个节目,你可能会须要其余的焦点来示意以后所属于的分类,咱们称之为暗焦点

 var vm = new FOCUS({
        darkFocus:[[1,0,2,3,4],[5,6,7,8]], //暗焦点列表一个数组蕴含多个数组,参数为id后的索引,代表这几个dom为一块暗焦点,并且数组第一个索引为默认选中的暗焦点
        darkGroup:[true,true], // 长度与darkFocus对应,代表每次进入暗焦点列表时,是否始终让这个列表的暗焦点被选中
        darkClass: "active", // 暗焦点被增加的class ,默认就是 active
        event: {
            darkFocusEvent: function (id) {
                // 你有可能会须要在焦点切换时依据以后的分类渲染新数据,
                // 咱们心愿你应用的是这个事件而不是focusEvent
                // 这是为了防抖,在暗焦点没扭转时反复获焦不会反复触发这个事件
                console.log("获取暗焦点",id) 
            },
            undarkFocusEvent: function (id) {
                console.log("失落暗焦点",id)
            },
            focusEvent: function (id) {
                console.log("获取焦点",id)
            },
            unfocusEvent: function (id) {
                console.log("失落焦点",id)
            },
        }
    })

6.使用各api实现一个tv端常见demo (demo)

tv最多的就是多级栏目的需要,在焦点切换时,对应的子列表,子节目都要发生变化,本文章次要介绍框架的应用,
故具体内容可下载源码与focus文件理解

demo地址

7.生命周期 (生命周期)

按目前的需要引入了一个初始创立时的生命周期created

应用形式:

 var vm = new FOCUS({
         created: function (next) {
             this.addDiv()
             next() //必须调用, 不调用无奈库就不执行初始化
         },
         methods: {
             addDiv: function () {
                 var div = document.createElement("div")
                 div.classList = "dom"
                 div.id = "item6"
                 var newCOntent= document.createTextNode("生命周期增加的dom");
 
                 div.appendChild(newContent);
 
                 document.body.appendChild(div);
             }
         }
     })
demo地址
周期名称 传参 形容
created next 提供一个next办法,在调用后库才会持续抓取页面的焦点并且初始化,此时能拜访methods里的办法

III new FOCUS传参

var vm = new FOCUS({ })

传参为一个对象,其中对象外部的属性如下:

属性名称 类型 形容
domIdName string 对立id,默认为”item”,如心愿对立id为 (“focusDom0″、”focusDom1″…),即该参数值为 “focusDom”
focusId string 须要首先聚焦的id,默认索引为0的元素
focusClass string 聚焦dom减少的class,默认为”focus”
pageState int 设置页面等级,详情参考II.4
forceMove object 批改dom的方向键逻辑,详情参考II.2
event object 按键处理事件,详情参考II.3
methods object 办法保留,相似vue的methods,详情参考II.5
darkFocus array 暗焦点,在焦点在别处时仍旧显示非凡款式,每个数组第一个索引为默认选中的暗焦点,详情参考II.6
darkClass string 暗焦点被增加的class ,默认就是 active,详情参考II.6
darkGroup array 长度与darkFocus对应,代表每次进入暗焦点列表时,是否始终让这个列表的暗焦点被选中,详情参考II.6
unFocusArr array 数组,数组能够有多个id索引,代表初始不容许被选中的焦点,之后可用上面介绍的 openFocus 解除禁止被选中

IV 框架的Api

应用办法:

在实例外部应用: 示例:this.requireFocus(0)

在实例内部应用: 示例:vm.requireFocus(0) (vm为实例对象)

        var vm = new FOCUS({
            event: {
                keyOkEvent: function (focusId) {
                    this.requireFocus(6) // 在实例外部应用
                }
            }
        })
        vm.requireFocus(6) // 在实例内部应用
Api名称 传参数量 传参 形容
requireFocus 1 number 使元素获取焦点,传参为索引值,例(使id为”item2″的元素获取焦点):this.requireFocus(2)
log 4(后三个参数可不传) 打印内容,字体大小(默认16px), 文字色彩(默认红色),背景色彩(默认彩色) tv端无控制台,所以须要此api显示打印信息
getDom 1 int 依据传参索引返回元素
getFocus 0 返回以后焦点索引
getParam 3 字段名:字符串 默认值 地址:默认以后地址 解析url传参
gotoPage 1 url地址 单纯的跳转url,可能会在须要跳转前发送申请而存在
getFocusDom 0 返回以后焦点dom元素
stopFocus 1 数组:内容为一个或多个dom索引 使数组内的焦点无奈被获取焦点
openFocus 1 数组:内容为一个或多个dom索引 使数组内的焦点从stopFocus内移除,可能获取焦点
refresh 0 调用后库会抛弃原来的焦点汇合,从新去抓取页面上的焦点

V 版本日志

版本号 更新内容 日期
1.0.6 提供一个初始化的生命周期,为了适配页面初始化时要增加dom的需要 2022-5-19
1.0.5 增加焦点切换前后事件,动静批改焦点获取与否,减少框架的灵活性 2022-3-8
1.0.4 增加暗焦点相干事件,以及暗焦点防抖等解决 2022-3-7
1.0.3 增加methods传参,用来优化代码标准,增加getparam办法,获取url参数 2022-3-3
1.0.2 增加打印调试api,以及readme.md排版更新,版本日志 2021-12-27
1.0.1 增加二级以上页面,失焦获焦事件 2021-12-21
1.0.0 具备tv端焦点框架根本需要 2021-12-20

其余

如果这个框架可能被很多应用到,我想我会十分的开心,如果你有什么感觉框架须要减少的好的倡议,我很荣幸可能晓得,这是我的联系方式,请表明来意,心愿您能给我一个点赞,这是对我最大的激励

vx:DoubleU-_

QQ:1026990903


推荐阅读
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 本文提供了一个详尽的前端开发资源列表,涵盖了从基础入门到高级应用的各个方面,包括HTML5、CSS3、JavaScript框架及库、移动开发、API接口、工具与插件等。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文介绍了.hbs文件作为Ember.js项目中的视图层,类似于HTML文件的功能,并详细讲解了如何在Ember.js应用中集成Bootstrap框架及其相关组件的方法。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文档介绍了如何使用OpenStack命令行工具在Keystone身份服务中创建和管理域、项目、用户及角色。随着Keystone命令向OpenStack命令集的迁移,了解这些新的命令格式对于系统管理员来说至关重要。 ... [详细]
author-avatar
志薇俊元4565
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有