热门标签 | 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


推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 一、路由首先需要配置路由,就是点击good组件进入goodDetail组件配置路由如下{path:goodDetail,component:goodDetail}同时在good组件中写入如下点击事件,路由中加入 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • php7 curl_init(),php7.3curl_init获取301、302跳转后的数据
    最近在做一个蜘蛛项目,发现在抓取数据时,有时会碰到301的页面,原本写的curl_init函数php7-远程获取api接口或网页内容&#x ... [详细]
  • 问题描述:域名已经备案,我全部都有,也在后台配置了,但是手机预览,还是请求失败,PC端是可以请求 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
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社区 版权所有