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


推荐阅读
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
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社区 版权所有