数字电视遥控器,只有为数不多的控制键,怎么样利用好,是对开发者一个挑战。
其中上、下、左、右、选择、五个键是最为重要的,本案例是一个电视短信,主要页面是左右两栏
左边是一个菜单列表,右边是详细列表。
一、采用ipanel浏览器
特点是兼容JS大部分,有自己特有的JS对象。
调试太麻烦,没有较有先进的调试工具,建议采用firefox等工具调试。
二、封装各功能点
各功能点封装成一个对象,取名为marker.
增加三个事件,即
a)选中事件,当控制键选中时触发。
b)失选事件,当控制键离开时触发。
c)单击事件,当控制键选中时按下确定键触发。
/**
*元素
*/
_$.Marker = function(_id,_tagid,_ext){
this.id = _id;
this.tagid = _tagid;
this.ext = _ext;
this.events = null;
this.eventType = { EVENT_CLICK : "click",
EVENT_SELECTED : "selected",
EVENT_UNSELECTED : "unselected"};
}
/**
*元素绑定事件
*/
_$.Marker.prototype.bind = function(event ,cb){
this.events = this.events == null ? {}:this.events;
this.events[event] = cb;
return this;
}
/**
*元素的单击事件
*/
_$.Marker.prototype.click = function(e){
if(this.events && this.events[this.eventType.EVENT_CLICK])
this.events[this.eventType.EVENT_CLICK](e);
};
/**
*元素选中事件
*/
_$.Marker.prototype.selected = function(e){
_$.focusmarker = this;
if(this.events && this.events[this.eventType.EVENT_SELECTED])
this.events[this.eventType.EVENT_SELECTED](e);
};
/**
*元素失选事件
*/
_$.Marker.prototype.unselected = function(e){
if(this.events && this.events[this.eventType.EVENT_UNSELECTED])
this.events[this.eventType.EVENT_UNSELECTED](e);
_$.focusmarker = null;
};
三、功能点封装成一个组
当功能点会有集合成一个功能点组,用户可以在各个组之间切换。
a)选中事件,当控制键选中时触发。
b)失选事件,当控制键离开时触发。
c)单击事件,当控制键选中时按下确定键触发。
/**
*组
*/
_$.Group = function(_id ,_markers ,_pos){
this.id = _id;
this.markers = _markers;
this.defaultpos = _pos;
this.pos = _pos;
this.events = null;
this.eventType = {EVENT_SELECTED : "selected"};
//排序
//未实现
//
}
//设置组里元素
_$.Group.prototype.setMarkers = function(_markers){
this.markers = null;
this.markers = _markers;
}
/**
*原来有就复盖,没有追加到最后
*/
_$.Group.prototype.addMarker = function(_marker){
for(var i=0;i<this.markers.length;i++){
if(_marker.id == this.markers[i].id){
this.markers[i] = _marker;
return;
}
}
this.markers[this.markers.length] = _marker;
}
/**
*组的下一个元素
*/
_$.Group.prototype.next = function(){
var oldmarker = this.markers[this.pos];
oldmarker.unselected({target:oldmarker});
var temp_pos = (this.pos + 1) % this.markers.length;
var marker = this.markers[temp_pos];
this.pos = temp_pos;
marker.selected({target:marker});
return marker;
}
/**
*组的上一个元素
*/
_$.Group.prototype.prev = function(){
var oldmarker = this.markers[this.pos];
oldmarker.unselected({target:oldmarker});
this.pos = this.pos == 0 ? this.markers.length : this.pos;
var temp_pos = (this.pos - 1) % this.markers.length;
var marker = this.markers[temp_pos];
this.pos = temp_pos;
marker.selected({target:marker});
return marker;
}
/**
*组的默认元素
*/
_$.Group.prototype.defaultMarker = function(){
return this.markers[this.defaultpos];
}
/**
*组的当前元素
*/
_$.Group.prototype.currentMarker = function(){
return this.markers[this.pos];
}
/**
*组的事件绑定
*/
_$.Group.prototype.bind = function(event ,cb){
this.events = this.events == null ? {}:this.events;
this.events[event] = cb;
return this;
}
/**
*组的选中事件
*/
_$.Group.prototype.selected = function(e){
_$.focusgroup = this;
if(this.events && this.events[this.eventType.EVENT_SELECTED])
this.events[this.eventType.EVENT_SELECTED](e);
this.markers[this.pos].selected({target:this.markers[this.pos]});
//设置当前焦点
};
/**
*组的失选事件
*/
_$.Group.prototype.unselected = function(e){
//todo
if(this.events && this.events[this.eventType.EVENT_UNSELECTED])
this.events[this.eventType.EVENT_UNSELECTED](e);
for(var i=0;i<this.markers.length;i++){
this.markers[i].unselected({target:this.markers[i]});
}
//设置当前焦点
_$.focusgroup = null;
}
三、把组打包成一个管理类,通管理类管理这些组
代码如下
_$.GroupsObj = function(_groups ,_pos ,_focusmarker ,_focusgroup){
this.groups = _groups;
this.defaultpos = _pos;
this.pos = _pos;
//排序
//未实现
//
_$.focusmarker = _focusmarker;
_$.focusgroup = _focusgroup;
}
/**
*组群初始化
*/
_$.GroupsObj.prototype.init = function(){
//alert(this.focusmarker);
_$.focusmarker.selected({target:_$.focusmarker});
_$.focusgroup.selected({target:_$.focusgroup});
}
/**
*设置组群
*/
_$.GroupsObj.prototype.setGroups = function(g){
this.groups = null;
this.groups = g;
}
/**
*原来有就复盖,没有追加到最后
*/
_$.GroupsObj.prototype.addGroup = function(g){
$$("debug").innerHTML += g.id + ",";
for(var i=0;i<this.groups.length;i++){
if(g.id == this.groups[i].id){
this.groups[i] = g;
return;
}
}
this.groups[this.groups.length] = g;
}
_$.GroupsObj.prototype.removeGroup = function(id){
for(var i=0;i<this.groups.length;i++){
if(id == this.groups[i].id){
this.groups.splice(i,1);
return;
}
}
}
/**
*组群的下一个元素
*/
_$.GroupsObj.prototype.next = function(){
var oldgroup = this.groups[this.pos];
oldgroup.unselected({target:oldgroup});
var temp_pos = (this.pos + 1) % this.groups.length;
var group = this.groups[temp_pos];
this.pos = temp_pos;
group.selected({target:group});
return group;
}
/**
*组群的上一个元素
*/
_$.GroupsObj.prototype.prev = function(){
var oldgroup = this.groups[this.pos];
oldgroup.unselected({target:oldgroup});
this.pos = this.pos == 0 ? this.groups.length : this.pos;
var temp_pos = (this.pos - 1) % this.groups.length;
var group = this.groups[temp_pos];
this.pos = temp_pos;
group.selected({target:group});
return group;
}
四、案例代码
//=========================================================
var groupsObj = null;
//初始化
function init(){
var reciverbox = new jok.Marker(0,"reciverbox","");
var sendbox = new jok.Marker(1,"sendbox","");
var infoadd = new jok.Marker(2,"infoadd","");
var birthday = new jok.Marker(3,"birthday","");
reciverbox.bind("click",clickHandle);
sendbox.bind("click",clickHandle);
infoadd.bind("click",clickHandle);
birthday.bind("click",clickHandle);
reciverbox.bind("selected",selectedHandle);
sendbox.bind("selected",selectedHandle);
infoadd.bind("selected",selectedHandle);
birthday.bind("selected",selectedHandle);
reciverbox.bind("unselected",unselectedHandle);
sendbox.bind("unselected",unselectedHandle);
infoadd.bind("unselected",unselectedHandle);
birthday.bind("unselected",unselectedHandle);
//============
/*
var record1 = new Marker(0,"record1","");
var record2 = new Marker(2,"record2","");
var record3 = new Marker(1,"record3","");
var record4 = new Marker(3,"record4","");
record1.bind("selected",selectedHandle);
record2.bind("selected",selectedHandle);
record3.bind("selected",selectedHandle);
record4.bind("selected",selectedHandle);
///
record1.bind("unselected",unselectedHandle);
record2.bind("unselected",unselectedHandle);
record3.bind("unselected",unselectedHandle);
record4.bind("unselected",unselectedHandle);
record1.bind("click",clickHandle);
record2.bind("click",clickHandle);
record3.bind("click",clickHandle);
record4.bind("click",clickHandle);
*/
function clickHandle(e){
var taget = e.taget;
alert(taget.tagid);
}
function selectedHandle(e){
var target = e.target;
//
//当用户下移或上移,得到焦点,组织数据
var html = "";
//变色
document.getElementById(target.tagid).style.color = "red";
if(jok.focusgroup.id != 0) return; //当是第一个组时进行动态加载,即左边的菜单条
if(target.tagid == "reciverbox")
html = createList("收件箱",5);
if(target.tagid == "sendbox")
html = createList("发件箱",4);
if(target.tagid == "birthday")
html = createList("生日信息",3);
if(target.tagid == "infoadd"){
groupsObj.removeGroup(1);
$$("box2").innerHTML = "";
return;
}
function createList(prefix,count){
var box2 = $$("box2");
var html = ""
for(var i=0;i<count;i++){
html += "<li><span id=\"record_"+i+"\">"+prefix+"----记录"+i+"</span></li>";
}
return html;
}
if(html != ""){
$$("box2").innerHTML = html;
var spans = $$("box2").getElementsByTagName("span");
var right_arr = [];
for(var i=0;i<spans.length;i++){
var record = new jok.Marker(i,spans[i].id,"");
record.bind("selected",selectedHandle).bind("unselected",unselectedHandle)
.bind("click",clickHandle);
right_arr[i] = record;
}
var right_group = new jok.Group(1,right_arr,0);
groupsObj.addGroup(right_group);
}
}
function unselectedHandle(e){
var target = e.target;
document.getElementById(target.tagid).style.color = "#000000";
}
var left_arr = new Array(reciverbox,sendbox,infoadd,birthday);
//var right_arr = new Array(record1,record2,record3,record4);
var left_group = new jok.Group(0,left_arr,0);
//var right_group = new Group(2,right_arr,0);
left_group.bind("selected",groupSelectedHandle);
//right_group.bind("selected",groupSelectedHandle);
function groupSelectedHandle(e){
var target = e.target;
}
//
groupsObj = new jok.GroupsObj([left_group], 0 , reciverbox , left_group);
//default
groupsObj.init();
//iframe
var iframedoc = null;
if (document.all){//IE
iframedoc = document.frames["dataiframe"].document;
}else{//Firefox
iframedoc = document.getElementById("dataiframe").contentDocument;
}
/*
var d = new Domm();
d.init(10,20);
d.prase();
*/
//alert(iframedoc.getElementById("nv").innerHTML);
}
var $$ = function(id){
return typeof(id) === "string" ? document.getElementById(id) : id;
}
/**
*控制键摸拟
*/
function donext(){
var _focusmarker = jok.focusgroup.next();
//alert("f_next>" + focusmarker.tagid);
}
function doprev(){
var _focusmarker = jok.focusgroup.prev();
//alert("f_prev>" + focusmarker.tagid);
}
function doleft(){
var _focusgroup = groupsObj.prev();
/*
focusmarker = focusgroup.currentMarker();
focusgroup.selected({target:focusmarker,group:focusgroup,groupsobj:groups});
focusmarker.selected({target:focusmarker,group:focusgroup,groupsobj:groups});
*/
}
function doright(){
var _focusgroup = groupsObj.next();
/*
focusmarker = focusgroup.currentMarker();
focusgroup.selected({target:focusmarker,group:focusgroup,groupsobj:groups});
focusmarker.selected({target:focusmarker,group:focusgroup,groupsobj:groups});
*/
}
/**
*确定按键
*/
function doexec(){
jok.focusmarker.click({taget:jok.focusmarker,group:jok.focusgroup});
}
//
html:
<body onLoad="init();">
<input type="button" onclick="donext();" value="下"/>
<input type="button" onclick="doprev();" value="上"/>
<input type="button" onclick="doleft();" value="左"/>
<input type="button" onclick="doright();" value="右"/>
<input type="button" onclick="doexec();" value="确定"/>
<div id="debug"></div>
<iframe id="dataiframe" src="data.html"></iframe>
<table>
<tr>
<td>
<ul id="box1">
<li><span id="reciverbox">收件箱</span></li>
<li><span id="sendbox">发件箱</span></li>
<li><span id="infoadd">写信息</span></li>
<li><span id="birthday">生日信息</span></li>
</ul>
</td>
<td>
<ul id="box2">
<li><span id="record1">记录1</span></li>
<li><span id="record2">记录2</span></li>
<li><span id="record3">记录3</span></li>
<li><span id="record4">记录4</span></li>
</ul>
</td>
</tr>
</table>
</body>
- 大小: 21.6 KB
分享到:
相关推荐
解析ts流中的pat、pmt、sdt、nit信息
意法半导体(ST)与茁壮网络(iPanel)合作开发中国下一代数字电视解决方案.pdf
iPanel_2.0 应用开发指南,用于指导WEB设计人员和WEB开发人员制作更适合于iPanel浏览器的应用
iPanel浏览器EVENT处理说明。 有用得着的同学,请扩散
iPanel 3.0 中间件集成接口手册-2011
公司内部培训资料。是自己总结出来的。有兴趣的,可以看看,但是,牵涉到机密问题,还是做个简单的。
iPanel、IPTV应用开发指南。 iPanel电视应用指南 iPanel对WEB标准的支持情况
iPanel2.0 IPTV Porting Guide-修订版5
国内赫赫有名的嵌入式浏览器iPanel的ST平台台移植参考代码,只需稍作改动就能在ST平台运行了。
matlab开发-ipanel。实现一个控制器面板来提供一个基本的Mathematica-“操纵”类工具。
这是iPanel 在做UI升级时要用到做87描述的工具
iPanel智慧养老营销方案.pptx
iPanel智慧社区合作方案.ppt
这个类添加了一个包含滑块/复选框/弹出菜单控制器的面板,以提供一个原始的 MATHEMATICA-'Manipulate'-like 工具。 接受任意数量参数的函数句柄与相应的控制器规范一起传入。 每个参数都与一个控制器相关联并成为一...
正弦信号的matlab代码 概述 该项目只是较大的“计算机仪器仪表专用工件”(ISAAC)项目的一小部分。 ISAAC是一个高性能,高度可重用,模块化和集成的,基于FPGA的通用仪器控制和计算平台,可满足地球科学国家研究...
frame name=\"leftmenu\" id=\"leftmenu\" scrolling=\"no\" noresize=\"noresize\" src=\"ipanel\" frameborder=\"0\">\r\n <frame name=\"table_index\" id=\"table_index\" scrolling=\"no\" src=\"table....
J2ME_游戏开发
MIDP2.0的GAME游戏开发包在J2ME游戏开发中经常被用到,很多新手朋友可能搞不懂如何使用这个包,通过这个实例的学习你可能会知道很多!
请使用在这里找到的新安装程序: : BandagedBD安装程序这是的Windows安装程序( 的mod)的源代码。 我决定将其放在一个单独的存储库中,主要是因为将它与JavaScript注入到Electron.js平台上并不适合将它与实际的...