HTML5振动API的黑心使用,如何通过

时间:2019-10-06 23:57来源:美高梅游戏网站
光阴流网络之今后(下) 2013/04/15 · HTML5 · 1评论 ·HTML5 来源:pingwest 用Web Components营造单页面应用 2015/01/19 · JavaScript· Web Components 本文由 伯乐在线 -周进林翻译,Mxt校稿。未经许可,禁

光阴流网络之今后(下)

2013/04/15 · HTML5 · 1 评论 · HTML5

来源:pingwest

用Web Components营造单页面应用

2015/01/19 · JavaScript · Web Components

本文由 伯乐在线 - 周进林 翻译,Mxt 校稿。未经许可,禁绝转发!
拉脱维亚语出处:www.polymer-project.org。接待加入翻译组。

您是何等使用Polymer营造一个单页应用的?那个标题大家在Polymer团队里曾经问过众多遍了。大家的答案(长久以来地)是“使用组件(component)!”。然则,使用新技艺去化解现存的难题往往不会及时得到明显的功用。如何把一批模块化组件组合到三个特大型的实用的接纳中去?

在本教程,笔者将会给你显得什么去营造三个效果与利益一体化的单页应用:

图片 1

  • 统统选择Polymer的基本成分构建
  • 利用响应式设计
  • 运用数据绑定天性过渡视图
  • 选择U奥迪Q5L路由和深层链接性格
  • 可访问键盘
  • 按需动态载入内容(可选)

 张开演示

提示:

Firefox是Andriod平台上头一无二协助振动的。其余的诸如Samsung浏览器,Chrome或许Opera都不辅助。Iphone也不协助。Windows Phone或HUAWEI根本没人介意的,所以自身就不测量检验了。

当页面使用振动API的时候,Firefox近期并不会申请权限。

您感到浏览器在震荡前是不是合宜有警告?照旧说这种高危机太低?作者想那要看那三个骗子公司是或不是会动用那一点了,或者要看客商是不是反对了。

更新: 感谢Reddit和HackerNews上边的评头品足,BB10犹如也支撑振动API,Windows Phone不帮助。

赞 收藏 3 评论

遵照 HTML5 营造 Web 操作系统

2012/09/29 · HTML5, JavaScript · 1 评论 · HTML5, Javascript

来源:IBM Developerworks

简介: Web 操作系统有着古板操作系统不恐怕比拟的优势,如能够随时随地使用别的极端进行会见,数据保存在劳动器端,空间更加大,数据安全性越来越好,能够应用服务器端的 CPU、内部存款和储蓄器等能源拓宽更进一竿复杂的运算。可是当下的 Web 操作系统前端多数基于 Flex、Silverlight、ActiveX 插件等本事开拓,存在着对活动设备的帮助性差,终端安全性差,开荒难度大等破绽。

HTML5 是下一代 web 语言的科班,具备包容性好,安全性高,功效丰裕,开辟方便人民群众等优点,非常符合如 Web 操作系统一类的富用户端网络应用的前端开垦。本文将显示什么使用 HTML5 提供的有余新技巧如:本地数据库、二十八线程开荒、录像协助、离线编制程序等塑造贰其中坚的 Web 操作系统。

简介

价值观的操作系统有着一些难以打败的毛病,如仅能在地面终端访问,或仅支持有限的长距离访谈,限于本地终端的能源,统计本领软弱,存款和储蓄空间有限,缺少有力的防火墙等一二种安全机制,安全性非常差。鉴于上述劣点,Web 操作系统应运而生 – Web 操作系统是一种基于浏览器的杜撰的操作系统,客户通过浏览器能够在内部进行应用程序的操作,以及有关数据的积累。Web 操作系统提供的着力服务有文本文书档案的创导与存款和储蓄,音频录像文件的播音与积存,提供对时间新闻的扶助等,越来越高端的劳务则含有即时通讯,邮件乃至游戏等劳动。Web 操作系统制服了观念操作系统的顽固的病痛,在互联网的支撑下,它能够在其余时间,任哪个地方点经由任何帮助Web 的巅峰进行拜谒,能够使用服务器端Infiniti的估计及存款和储蓄能源,客商数据保存在劳务器端,安全性较高。

图片 2

相关技术

现阶段塑造 Web 操作系统的前端技巧主要有 Flex、Silverlight、ActiveX 插件等等,它们各有一点点优短处。

Flex

Flex 是四个特出的富客商端应用框架,专心于页面展现,Adobe 专门的学业维护,统一稳固,何况其脚本语言 ActionScript3 是面向对象的,特别契合程序猿使用。劣点则是耗电高,占用带宽多,对运动应用的支撑性差。

Silverlight

Silverlight 是由微软生产的用于跟 Flash 抗衡的 中华VIA(富互连网应用)应用方案,优点是有着硬件级的增长速度功效,但它前段时间仍不成熟,对非 Windows 系统的接济性并相当不足好,且学习难度极大。

ActiveX 插件

ActiveX 插件同样是微软推出的 锐界IA 建设方案,它是两个怒放的消除方案,能够宽容多样语言,可是它的劣点也是猛烈的,客商须求调动浏览器的平安品级并下载插件才具运作 宝马X5IA 应用,比十分的大地下落了安全性。

HTML5

为推动 web 规范化运动的升华,W3C 推出了下一代 HTML 的职业 – HTML5,为众多的营业所所协助,由此全部优异的前景。它有以下特点:首先,为增长顾客体验,强化了 web 网页的表现质量;其次,为适应 EscortIA 应用的上进,追加了地点数据库等 web 应用的效果;再度,由于中度规范化以及无数浏览器厂家的努力援助,它的包容性和安全性非常高;最终它是一种轻松的语言,轻巧为大规模开采者明白。更为难得的是,由于节俭和耗能低,在移动设备上 HTML5 将有所更加大的优势。由此更契合如 Web 操作系统一类的 PAJEROIA 应用的前端开荒。

系统简要介绍

本系统依据 HTML5 开荒,利用 HTML5 引进的多种新本事如拖拽 API、摄像标签、本地数据库、draw API、多线程开采、离线编制程序等提供了三个宗旨的 Web 操作系统蒙受,富含了对桌面包车型客车支撑、应用程序的支撑,提供了二个简约的录制播放器和记事本以及贰个石英钟,并对系统日志进行了笔录,别的还提供了对离线状态的支持。

桌面完毕

系统对桌面包车型大巴支撑至关心保养要不外乎应用程序Logo的张开与拖拽,以及桌面包车型大巴上下文菜单等。

桌面拖拽

桌面包车型地铁布局由必然数量的 div 组成,它们依照顺序依次排列在矩形的桌面上,为应用程序Logo的开采与拖拽提供了着力的支撑。

清单 1. 创建 div

XHTML

var iconHolder = document.createElement("div"); iconHolder.id = 'iconHolder' + i; iconHolder.className = "iconHolder"; mainDiv.appendChild(iconHolder);

1
2
3
4
var iconHolder = document.createElement("div");
iconHolder.id = 'iconHolder' + i;
iconHolder.className = "iconHolder";
mainDiv.appendChild(iconHolder);

HTML5 提供了对 drag 事件的支撑,大大简化了达成拖拽的难度。通过对 dragstart 事件的监听,将被拖拽的应用程序Logo所在的 div 记录下来,作为拖拽的源。

清单 2. 拖拽辅助

XHTML

iconHolder.add伊芙ntListener("dragstart", function(ev) { var dt = ev.dataTransfer; dt.setData("text/plain", ev.currentTarget.id);// 记录被拖拽Logo的 id }, false); iconHolder.addEventListener("drop", function(ev) { var dt = ev.dataTransfer; var srcIconHolderId = dt.getData("text/plain"); var srcIconHolder = document.getElementById(srcIconHolderId); // 假如拖拽至回收站,则删掉被拖拽Logo,不然调换两Logo地点if(ev.currentTarget.firstChild && ev.currentTarget.firstChild.id == "recycleBin" && srcIconHolder.firstChild.id != "recycleBin"){ srcIconHolder.innerHTML = ""; }else if(ev.currentTarget.firstChild){ var temp = ev.currentTarget.firstChild; ev.currentTarget.appendChild(srcIconHolder.firstChild); srcIconHolder.appendChild(temp); }else{ ev.currentTarget.appendChild(srcIconHolder.firstChild); } }, false);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
iconHolder.addEventListener("dragstart", function(ev) {
var dt = ev.dataTransfer;
dt.setData("text/plain", ev.currentTarget.id);// 记录被拖拽图标的 id
}, false);
 
iconHolder.addEventListener("drop", function(ev) {
var dt = ev.dataTransfer;
var srcIconHolderId = dt.getData("text/plain");
var srcIconHolder = document.getElementById(srcIconHolderId);
 
// 如果拖拽至回收站,则删掉被拖拽图标,否则互换两图标位置
if(ev.currentTarget.firstChild && ev.currentTarget.firstChild.id == "recycleBin" &&
srcIconHolder.firstChild.id != "recycleBin"){
                srcIconHolder.innerHTML = "";
}else if(ev.currentTarget.firstChild){
        var temp =  ev.currentTarget.firstChild;
        ev.currentTarget.appendChild(srcIconHolder.firstChild);
        srcIconHolder.appendChild(temp);
}else{
       ev.currentTarget.appendChild(srcIconHolder.firstChild);
}
}, false);

通过对 drop 事件的监听,能够获取拖拽的源,以及拖拽的目的 div。若指标 div 为空,则将源 div 中的应用程序Logo转移至指标 div 中。若目的 div 中已满含应用程序Logo,则将三个Logo的地方调换。若回收站Logo处于目的 div 中,回收站将发挥功能并将源 div 中的应用程序图标删除。图 1 突显了桌面拖拽的职能。

图 1. 桌面拖拽效果

图片 3前后相继张开

前后相继可以以二种情势张开,左键点击或通过上下文菜单张开。

由此监听 div 的 onclick 事件,获取要开发的应用程序 id,并应用 openApp 方法张开相应的应用程序可落成对左键点击的支持。

清单 3. 左键点击

XHTML

iconHolder.onclick = function(ev){ if(ev.currentTarget.firstChild){ openApp(ev.currentTarget.firstChild.id); ev.stopPropagation(); } };

1
2
3
4
5
6
iconHolder.onclick =  function(ev){
if(ev.currentTarget.firstChild){
        openApp(ev.currentTarget.firstChild.id);
        ev.stopPropagation();
}
};

由此监听 div 的 oncontextmenu 事件,获取要开荒的应用程序 id,并使用 openAppContextMenu 方法展现相应应用程序的上下文菜单,可实现对右键上下文菜单的帮助。

清单 4. 上下文菜单

XHTML

iconHolder.oncontextmenu = function(ev){ if(ev.currentTarget.firstChild){ openAppContextMenu(ev.currentTarget.firstChild.id, ev); ev.stopPropagation(); } return false; };

1
2
3
4
5
6
7
iconHolder.oncontextmenu =  function(ev){
if(ev.currentTarget.firstChild){
        openAppContextMenu(ev.currentTarget.firstChild.id, ev);
        ev.stopPropagation();
}
return false;
};

选择相应应用程序的 id,能够获得相应应用程序的剧本,并施行,同不时候在系统日志中著录下相应的操作。

清单 5. 程序展开

XHTML

function openApp(appId){ var time = new Date().getTime(); var action = "open app"; var details = "open: " + appId; addHistory(time, action, details);// 记录系统日志 var appScript = getAppScript(appId);// 获取应用程序脚本 eval(appScript);// 推行应用程序 }

1
2
3
4
5
6
7
8
function openApp(appId){
    var time = new Date().getTime();
    var action = "open app";
    var details = "open: " + appId;
    addHistory(time, action, details);// 记录系统日志
    var appScript = getAppScript(appId);// 获取应用程序脚本
    eval(appScript);// 执行应用程序
}

清单 6. 打开程序上下文菜单

XHTML

function openAppContextMenu(appId, ev){ var appContextMenu = document.getElementById("appContextMenu"); appContextMenu.style.display="block";// 令上下文菜单可知appContextMenu.style.pixelTop=ev.clientY;// 设置内外文菜单地方appContextMenu.style.pixelLeft=ev.clientX; appContextMenu.style.background = "#eee"; appContextMenu.style.color = "black"; appContextMenu.style.fontSize = "30"; appContextMenu.style.width = "200px"; appContextMenu.style.height = "220px"; appContextMenu.style.opacity = 0.5;// 令上下文菜单折射率为 百分之五十appContextMenu.innerHTML = ""; // 获取应用程序相应上下文菜单的内容 var apps = getApps(); for(var i=0; i<apps.length; i++){ if(apps[i].appId == appId){ for(var j=0; j<apps[i].contextMenu.length; j++){ appContextMenu.innerHTML += "<div class='appContextMenuItem' onclick="appContextMenu.style.display='none';" + apps[i].contextMenu[j].action + "" onmouseover='this.style.background="darkblue"' onmouseout='this.style.background="#eee"'>" +apps[i].contextMenu[j].name+"</div>"; } break; } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function openAppContextMenu(appId, ev){
var appContextMenu = document.getElementById("appContextMenu");
appContextMenu.style.display="block";// 令上下文菜单可见
appContextMenu.style.pixelTop=ev.clientY;// 设置上下文菜单位置
appContextMenu.style.pixelLeft=ev.clientX;
appContextMenu.style.background = "#eee";
appContextMenu.style.color = "black";
appContextMenu.style.fontSize = "30";
appContextMenu.style.width = "200px";
appContextMenu.style.height = "220px";
appContextMenu.style.opacity = 0.5;// 令上下文菜单透明度为 50%
appContextMenu.innerHTML = "";
 
// 获取应用程序相应上下文菜单的内容
var apps = getApps();
for(var i=0; i<apps.length; i++){
                if(apps[i].appId == appId){
                        for(var j=0; j<apps[i].contextMenu.length; j++){
                        appContextMenu.innerHTML += "<div class='appContextMenuItem'
                        onclick="appContextMenu.style.display='none';" +
                        apps[i].contextMenu[j].action + ""
                        onmouseover='this.style.background="darkblue"'
                        onmouseout='this.style.background="#eee"'>"
                        +apps[i].contextMenu[j].name+"</div>";
                        }
                        break;
                 }  
}
}

应用程序的上下文菜单由名称叫 appContextMenu 的 div 完成,将 oncontextmenu 事件中的 clientX 及 clientY 作为上下文菜单出现的职位,并将其反射率设置为 0.5。利用相应应用程序的 id 获取上下文菜单对应的开始和结果,并将其填写至上下文菜单。

图 2 展现了应用程序上下文菜单张开时的机能。

图 2. 应用程序上下文菜单

图片 4上下文菜单

桌面上下文菜单的兑现格局与应用程序上下文菜单的贯彻格局为主周围,图 3 和图 4 分别是桌面以及职责栏的上下文菜单。

图 3. 桌面上下文菜单

图片 5

 图 4. 职务栏上下文菜单

图片 6摄像播放器

系统提供了一个差相当的少的录像播放器,它帮忙从系统外界拖拽录像文件实行播报。

适合互联网媒体的进化,HTML5 提供了录制标签 video 以便于增加对录像的援救,大大简化了 web 播放器开辟的难度,开拓人员仅凭几行代码,就足以付出出二个基本功能完善的录制播放器。

清单 7. 录制标签的创始

XHTML

var video = document.createElement('video'); video.id ='video'; video.src =''; video.width = 370; video.height = 260; video.controls = 'controls'; video.className = 'video'; appHolder.appendChild(video); addDragSupport(appHolder);

1
2
3
4
5
6
7
8
9
var video = document.createElement('video');
video.id ='video';
video.src ='';
video.width  = 370;
video.height = 260;
video.controls = 'controls';
video.className = 'video';
appHolder.appendChild(video);
addDragSupport(appHolder);

清单 7 中布局了贰个 video 标签并将其加多到多少个名叫 appHolder 的 div 中。代码的尾声一行为其增添了拖拽的援助。

HTML5 不但支持浏览器内的拖拽,也援助浏览器与本地系统里头的拖拽。清单 8 显示了为叁个 div 增加拖拽援助的经过。

清单 8. 增多拖拽匡助

JavaScript

function addDragSupport(dropbox){ document.addEventListener("dragenter", function(e){ }, false); document.addEventListener("dragleave", function(e){ }, false); dropbox.addEventListener("dragenter", function(e){ }, false); dropbox.addEventListener("dragleave", function(e){ }, false); dropbox.addEventListener("dragenter", function(e){ e.stopPropagation(); e.preventDefault(); }, false); dropbox.addEventListener("dragover", function(e){ e.stopPropagation(); e.preventDefault(); }, false); dropbox.addEventListener("drop", function(e){ handleFiles(e.dataTransfer.files, e.currentTarget, e); e.stopPropagation(); e.preventDefault(); }, false); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function addDragSupport(dropbox){
document.addEventListener("dragenter", function(e){
}, false);
document.addEventListener("dragleave", function(e){
}, false);
dropbox.addEventListener("dragenter", function(e){
}, false);
dropbox.addEventListener("dragleave", function(e){
}, false);
dropbox.addEventListener("dragenter", function(e){
e.stopPropagation();
e.preventDefault();
}, false);
dropbox.addEventListener("dragover", function(e){
e.stopPropagation();
e.preventDefault();
}, false);
dropbox.addEventListener("drop", function(e){
handleFiles(e.dataTransfer.files, e.currentTarget, e);
e.stopPropagation();
e.preventDefault();              
}, false);  
}

内部,handleFiles 函数表达了哪些对拖拽的文件实行拍卖。

清单 9. 拖拽管理

JavaScript

function handleFiles(files, dropbox, e) { if(files.length == 0){// 若文件子虚乌有,则用相应文本替代 var dt = e.dataTransfer; var text = dt.getData("text/plain"); var p = document.createElement("p"); p.innerHTML += text; dropbox.appendChild(p); return; } for (var i = 0; i < files.length; i++) { var file = files[i]; var fileProcessor = dropbox.firstChild; fileProcessor.classList.add("obj"); fileProcessor.file = file; // 增添文书 var reader = new FileReader(); reader.onload = (// 读取文件内容 function(aFileProcessor) { return function(e) { aFileProcessor.src = e.target.result; }; } )(fileProcessor); reader.readAsDataUOdysseyL(file); } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function handleFiles(files, dropbox, e) {
    if(files.length == 0){// 若文件不存在,则用相应文本代替
         var dt = e.dataTransfer;
         var text = dt.getData("text/plain");
         var p = document.createElement("p");
         p.innerHTML += text;
         dropbox.appendChild(p);
         return;
}
 
for (var i = 0; i < files.length; i++) {
         var file = files[i];
         var fileProcessor = dropbox.firstChild;
         fileProcessor.classList.add("obj");
         fileProcessor.file = file; // 添加文件
 
         var reader = new FileReader();
         reader.onload = (// 读取文件内容
         function(aFileProcessor) {
                 return function(e) {
                 aFileProcessor.src = e.target.result;
};
}
)(fileProcessor);
  reader.readAsDataURL(file);
}
}

handleFiles 函数首先决断文件是还是不是存在,若荒诞不经,则以相应文字替代,若存在,则对

怀有文件相继进行处理。向 fileprocessor( 这里是录像标签 ) 添Gavin件,然后接纳 FileReader 读取文件内容至 fileprocessor 拓宽管理。

图 5 展现了拖拽三个摄像文件 movie.ogg 到播放器的职能。

图 5. 摄像播放

图片 7

本地存款和储蓄

Web 操作系统平常将多数数量存款和储蓄于劳动器端,那样做的补益总之,数据存款和储蓄空间更加大,安全性越来越好。可是如此做也可以有不足之处,由于网络的平安照旧较本地球磁性盘差,所以在退出网络的场馆下,Web 操作系统不可能获取相应的数目财富,由此 Web 操作系统须求自然的访谈本地存款和储蓄空间的力量,当然本地存储空间仅是用作劳务器端存款和储蓄的一个补给,它的长空有限,访谈也遇到料定的界定。

一如既往,HTML 以 Cookie 作为拜访本地空间的方法,可是,这种措施具有非常多欠缺和不足,如存款和储蓄的数目格式过于轻易,经常仅为键值对;存款和储蓄的空中山大学小有限。为此,HTML5 提供了本土数据库以加强地点存款和储蓄空间的拜望技术,它是一个简化版的数据库,能够协理模拟的 SQL 以及轻巧的事务管理等功用。

系统为永葆地点存款和储蓄,创制了四个名字为 MyData 的数据库。清单 10 呈现了数据库创造的进度。

清单 10. 创办数据库

XHTML

var db; var openDatabase; if(openDatabase != undefined) db = openDatabase('MyData', '', 'My Database', 102400);

1
2
3
4
var db;
var openDatabase;
if(openDatabase != undefined)
     db = openDatabase('MyData', '', 'My Database', 102400);

里面 MyData 为数据库的名目,省略的参数为数据库的版本,My Database 为突显的名号,最后的数字为数据库预估长度(以字节为单位)。

系统日志将系统在某有时间的行事操作记录下来,本地数据库为其提供仓库储存支持。日志在数据库中积累为表 History,包罗 3 个字段,分别为时间,操作,及操作的详细音讯。清单 11 展现了系统是哪些记录日志的。

清单 11. 日志记录

XHTML

var time = new Date().getTime(); var action = "open app"; var details = "open: " + appId; addHistory(time, action, details);// 向系统日志中增加一条记下 function addHistory(time, action, details){ if(openDatabase != undefined) db.transaction( function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS History(time INTEGER, action TEXT, details TEXT)',[]);// 创制日志记录表 tx.executeSql('INSERT INTO History VALUES(?, ?, ?)', [time, action, details], // 插入一条日志 function(tx, rs) { //alert("store: "+time+"-"+action+"-"+details); }, function(tx, error) { //alert(error.source + "::" + error.message); }); }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var time = new Date().getTime();  
var action = "open app";
var details = "open: " + appId;
addHistory(time, action, details);// 向系统日志中添加一条记录
 
function addHistory(time, action, details){
if(openDatabase != undefined)
db.transaction(
function(tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS History(time INTEGER,
action TEXT, details TEXT)',[]);// 创建日志记录表  
tx.executeSql('INSERT INTO History VALUES(?, ?, ?)', [time,
action, details], // 插入一条日志
function(tx, rs) {  
//alert("store: "+time+"-"+action+"-"+details);  
              },  
function(tx, error) {
    //alert(error.source + "::" + error.message);  
});  
});  
}

清单的首先片段显得了何等调用日志记录,第二部分显得了日记记录的事无巨细经过。在多少个transaction 中,首先判定表 History 是不是存在,若不设有,则成立它。第4局地举行一条 SQL 语句,向数据库中插入当前的日记。

由此查找表 History,大家得以查看系统日志,清单 12 展现了哪些从数据库中询问系统日志,并将其出示出来。

清单 12. 日志展现

XHTML

var historyTable = document.getElementById("historyTable"); // 定义表头 historyTable.innerHTML = ""; var th = document.createElement('thead'); th.style = "color:#CC3300"; var th1 = document.createElement('td'); th1.align = "center"; th1.width=300; th1.innerHTML = "Time"; var th2 = document.createElement('td'); th2.align = "center"; th2.width=100; th2.innerHTML = "Action"; var th3 = document.createElement('td'); th3.align = "center"; th3.width=150; th3.innerHTML = "Details"; th.appendChild(th1); th.appendChild(th2); th.appendChild(th3); historyTable.appendChild(th); if(openDatabase != undefined) db.transaction(function(tx) { tx.executeSql('SELECT * FROM History', [], function(tx, rs) { // 将日志逐个显示到表的各行中 for(var i = 0; i < rs.rows.length && i<15; i++) { var tr = document.createElement('tr'); var td1 = document.createElement('td'); td1.style.paddingLeft = "3px"; td1.style.paddingRight = "3px"; var t = new Date(); t.setTime(rs.rows.item(i).time); td1.innerHTML = t.toLocaleDateString()+ " "+t.toLocaleTimeString(); var td2 = document.createElement('td'); td2.style.paddingLeft = "3px"; td2.style.paddingRight = "3px"; td2.innerHTML = rs.rows.item(i).action; var td3 = document.createElement('td'); td3.style.paddingLeft = "3px"; td3.style.paddingRight = "3px"; td3.innerHTML = rs.rows.item(i).details; tr.appendChild(td1); tr.appendChild(td2); tr.appendChild(td3); historyTable.appendChild(tr); } }); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
var historyTable = document.getElementById("historyTable");
 
// 定义表头
historyTable.innerHTML = "";
var th = document.createElement('thead');
th.style = "color:#CC3300";
var th1 = document.createElement('td');
th1.align = "center";
th1.width=300;
th1.innerHTML = "Time";
var th2 = document.createElement('td');
th2.align = "center";
th2.width=100;
th2.innerHTML = "Action";
var th3 = document.createElement('td');
th3.align = "center";
th3.width=150;
th3.innerHTML = "Details";
th.appendChild(th1);  
th.appendChild(th2);  
th.appendChild(th3);
historyTable.appendChild(th);
 
if(openDatabase != undefined)
db.transaction(function(tx) {    
tx.executeSql('SELECT * FROM History', [], function(tx, rs)
{  
      // 将日志逐条显示到表的各行中
for(var i = 0; i < rs.rows.length && i<15; i++) {                    
var tr = document.createElement('tr');
var td1 = document.createElement('td');
td1.style.paddingLeft = "3px";
td1.style.paddingRight = "3px";
 
var t = new Date();  
t.setTime(rs.rows.item(i).time);  
td1.innerHTML = t.toLocaleDateString()+
" "+t.toLocaleTimeString();
 
var td2 = document.createElement('td');  
td2.style.paddingLeft = "3px";
td2.style.paddingRight = "3px";
td2.innerHTML = rs.rows.item(i).action;
 
var td3 = document.createElement('td');
td3.style.paddingLeft = "3px";
td3.style.paddingRight = "3px";
td3.innerHTML = rs.rows.item(i).details;  
 
tr.appendChild(td1);  
tr.appendChild(td2);  
tr.appendChild(td3);
 
historyTable.appendChild(tr);                  
}  
});  
});

清单 12 中,首先获得用于突显的日志的 HTML 表格 historyTable,并安装其样式及表头。

接下来在二个 transaction( 事务 ) 中,试行一条 SQL 语句,查询系统日志,并将每条日志增加为 historyTable 中的一行以便展现。图 6 展现了系统日志的意义。

图 6. 系统日志

图片 8

记事本

系统提供了四个简练的记事本,达成了文本文书档案的基本操作。文本文档包蕴标题和剧情五个显式属性,以及贰个名称叫id 的隐式属性。与系统日志类似,本地数据库为文本数据的积累提供了尾部的协助。图 7 突显了记事本程序的分界面。

图 7. 记事本

图片 9

当编辑完文书档案的标题与内容后,点击左上角的保存开关,将实施 createFile 函数。清单 13 显示了 createFile 函数的详细进度。

清单 13. 创办理文件件

XHTML

function createFile(fileId, fileTitle, fileContent){ var idx = 1; var update = false;//false 表示新建,true 表示修改 if(openDatabase != undefined) db.transaction(function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS TextFiles(idx INTEGER, title TEXT, content TEXT)',[]);// 成立文本文书档案表 tx.executeSql('SELECT * FROM TextFiles', [], function(tx, rs){ for(var i = 0; i < rs.rows.length; i++) { // 若文书档案存在,则修改它 if(rs.rows.item(i).idx == fileId){ db.transaction(function(tx) { tx.executeSql('UPDATE TextFiles SET title=?, content=? WHERE idx='+fileId, [fileTitle, fileContent], function(tx, rs) { alert("update successfully"); }); }); return; } } // 若文书档案不设有,则新建二个文书档案 if(rs.rows.length>0) idx = rs.rows.item(rs.rows.length-1).idx + 1; db.transaction(function(tx) { tx.executeSql('INSERT INTO TextFiles VALUES(?, ?, ?)', [idx, fileTitle, fileContent], function(tx, rs){ alert("save successfully: "+idx+"-"+fileTitle+ "-"+fileContent); createFileIcon(idx); }, function(tx, error) { alert(error.source + "::" + error.message); }); }); }); }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function createFile(fileId, fileTitle, fileContent){
     var idx = 1;
     var update = false;//false 表示新建,true 表示修改
 
     if(openDatabase != undefined)
         db.transaction(function(tx) {
         tx.executeSql('CREATE TABLE IF NOT EXISTS TextFiles(idx INTEGER,
         title TEXT, content TEXT)',[]);// 创建文本文档表
         tx.executeSql('SELECT * FROM TextFiles', [], function(tx, rs){
             for(var i = 0; i < rs.rows.length; i++) {
                // 若文档存在,则修改它
                 if(rs.rows.item(i).idx == fileId){
                     db.transaction(function(tx) {    
                     tx.executeSql('UPDATE TextFiles
                     SET title=?, content=?
                     WHERE idx='+fileId,
                     [fileTitle, fileContent],
                     function(tx, rs) {  
                             alert("update successfully");
                     });  
                 });
                 return;
             }        
}    
// 若文档不存在,则新建一个文档        
if(rs.rows.length>0)
idx = rs.rows.item(rs.rows.length-1).idx + 1;
db.transaction(function(tx) {                        
tx.executeSql('INSERT INTO TextFiles VALUES(?, ?, ?)', [idx, fileTitle, fileContent],
               function(tx, rs){  
               alert("save successfully: "+idx+"-"+fileTitle+ "-"+fileContent);  
               createFileIcon(idx);  
},  
function(tx, error) {
                alert(error.source + "::" + error.message);  
                 });  
             });
         });
     });
}

清单 13 首先在三个 transaction 中,首先判定用于存款和储蓄文本文书档案的表 TextFiles 是或不是留存,若空中楼阁,则开创它。然后通过查询表 TextFiles 推断文本文书档案是还是不是留存,若存在,则当前操作为更新操作,程序将实践一条 SQL 语句,对现阶段文本文书档案进行更新。若不真实,则取当前最大文书档案 id 并加 1 当作新文书档案的 id,并施行一条 SQL 语句,将文书档案信息,包罗文书档案id,以及标题和剧情插入到数据库中,并于插入操作结束后的回调方法中,利用 createFileIcon 方法在桌面上为新文书档案创设叁个文书档案图标。清单 14 突显了 createFileIcon 方法的现实性进度。

清单 14. 创立文档Logo

XHTML

function createFileIcon(fileId){ var iconHolder; for(var i=1;i<=120;i++){// 查询第3个为空的职位 iconHolder = document.getElementById('iconHolder' + if(!iconHolder.firstChild ){ var text = document.createElement('img'); text.src = "images/text.gif"; text.id = fileId; iconHolder.appendChild(text); text.onclick = function(ev){ if(ev.currentTarget){ openApp('notebook');// 打开记事本应用程序 var saveHolder = document.getElementById('saveHolder'); saveHolder.onclick = function(){ var title = document.getElementById('title'); var content = document.getElementById('content'); createFile(fileId, title.value, content.value);// 成立文本文书档案 }; var openedFileId = ev.currentTarget.id; if(openDatabase != undefined) db.transaction(function(tx) {// 查询数据库,展现文书档案内容 tx.executeSql('SELECT * FROM TextFiles', [], function(tx, rs){ for(var i = 0; i < rs.rows.length; i++) { if((rs.rows.item(i).idx+"") == (openedFileId+"")){ var title = document.getElementById('title'); var content = document.getElementById('content'); title.value = rs.rows.item(i).title; content.value = rs.rows.item(i).content;} } }); }); ev.stopPropagation(); } }; break; } }//for }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function createFileIcon(fileId){
     var iconHolder;
     for(var i=1;i<=120;i++){// 查询第一个为空的位置
         iconHolder = document.getElementById('iconHolder' + if(!iconHolder.firstChild ){
             var text = document.createElement('img');
             text.src = "images/text.gif";
             text.id = fileId;
             iconHolder.appendChild(text);
             text.onclick =  function(ev){  
                 if(ev.currentTarget){
                 openApp('notebook');// 打开记事本应用程序
                 var saveHolder = document.getElementById('saveHolder');
                 saveHolder.onclick  = function(){
                     var title = document.getElementById('title');
                     var content = document.getElementById('content');
                     createFile(fileId, title.value, content.value);// 创建文本文档
                 };
 
             var openedFileId = ev.currentTarget.id;
             if(openDatabase != undefined)
             db.transaction(function(tx) {// 查询数据库,显示文档内容
             tx.executeSql('SELECT * FROM TextFiles', [], function(tx, rs){
                 for(var i = 0; i < rs.rows.length; i++) {  
                 if((rs.rows.item(i).idx+"") == (openedFileId+"")){
                     var title = document.getElementById('title');
                     var content = document.getElementById('content');          
                     title.value = rs.rows.item(i).title;                  
                     content.value = rs.rows.item(i).content;}    
                              }
                });
});
   ev.stopPropagation();
}
};
break;
}    
}//for
}

清单 14 首先在桌面中查找多少个空的 div,然后成立几个文书档案Logo,并将其填充至 div。文书档案Logo有二个 id 属性对应文档id。最终为文书档案Logo增添点击事件管理函数,当点击文书档案Logo时,会率先张开记事本,然后依照文书档案Logo的 id 查询数据库,提取文书档案的标题和剧情开展彰显。

图 8 显示了创设后的文本文书档案,点击后的服从如图 7 所示。

图 8. 文本文书档案

图片 10时钟

系统提供了一个总结的石英钟用以展现当前光阴,它由二个表面以及分针和时针组成,能够随着年华的生成动态地转移。今后的 web 应用使用 JavaScript 或 Flash 达成此类功效,其复杂综上说述。借助 HTML5 的 draw API,能够轻便地画出所需的图片,十分的大的有利了此类应用的构建,其它,HTML5 还提供了往年 JavaScript 无法支撑的八线程编制程序,大大进步了 web 应用的交互性和足够性。

石英表有一个着力的表面,它仅是一副简单的图纸,如图 9 所示。

图 9. 表盘

图片 11

在表面之上,建有二个 canvas( 画布 ),如清单 15 所示。

清单 15. 画布

JavaScript

<canvas id="canvas" width="128px" height="128px"></canvas>

1
<canvas id="canvas" width="128px" height="128px"></canvas>

接下去,清单 17 将要画布上模拟出机械钟以及分针,在那后边,额外部须求要叁个后台线程用以总结时间,它被定义在名称叫time.js 的单身脚本文件中,如清单 16 所示。

清单 16. 后台线程

XHTML

onmessage = function(event) { //var i = 1; setInterval(function() { //i++; postMessage(""); }, 60000); };

1
2
3
4
5
6
7
8
onmessage = function(event)
{
//var i = 1;
    setInterval(function() {
    //i++;
    postMessage("");
    }, 60000);
};

每过 60 分钟,后台线程将会上前台线程发送一个空音讯,以告知前台线程有 60 秒钟已经过去了。

清单 17. 前台线程的初阶化

XHTML

var canvas = document.getElementById("canvas"); if (canvas == null) return false; var context = canvas.getContext('2d');// 这是二个二维的图像 context.lineWidth = 2; context.translate(64, 64);// 定义原点 // 伊始化分针 context.beginPath(); context.moveTo(0,0);// 从原点开始 var date = new Date(); var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30); var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30); context.lineTo(mhx, mhy);// 至分针末端所在地点 context.closePath(); context.stroke(); // 开始化时针 context.beginPath(); context.moveTo(0,0);// 从原点伊始 var date = new Date(); var hour = date.getHours(); if(hour>=12) hour = hour - 12; var minute = date.getMinutes(); var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360); var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360); context.lineTo(hhx, hhy);// 至时针末端所在地方 context.closePath(); context.stroke();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var canvas = document.getElementById("canvas");
if (canvas == null)  
return false;  
var context = canvas.getContext('2d');// 这是一个二维的图像
context.lineWidth = 2;
context.translate(64, 64);// 定义原点
 
// 初始化分针
context.beginPath();
context.moveTo(0,0);// 从原点开始
var date = new Date();
var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30);
var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30);
context.lineTo(mhx, mhy);// 至分针末端所在位置
context.closePath();
context.stroke();
 
// 初始化时针
context.beginPath();
context.moveTo(0,0);// 从原点开始
var date = new Date();
var hour = date.getHours();
if(hour>=12)
hour = hour - 12;
var minute = date.getMinutes();
var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360);
var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360);
context.lineTo(hhx, hhy);// 至时针末端所在位置
context.closePath();
context.stroke();

前台线程首先会得到canvas,并设置表盘中央为坐标原点。然后,获取当明天子,总结分针当前所应指向的坐标,然后从原点出发,画出分针。对于时针,若系统为 24 小时制,需求首先转化为 12 时辰制,此后的拍卖附近于分针。

接下去,供给将前台与后台线程联系起来,利用 HTML5 提供的八线程编程方法,注解 Worker 对象作为后台线程的代理,并动用 onmessage 事件,对后台线程发出的消息实行管理。

清单 18. 前台线程的 onmessage 事件

XHTML

var worker = new Worker("js/timer.js"); worker.onmessage = function(event){ context.clearRect(-64, -64, 128, 128);// 清空分针和时针 // 重画分针 context.beginPath(); context.moveTo(0,0);// 从原点伊始 var date = new Date(); var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30); var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30); context.lineTo(mhx, mhy);// 至分针末端所在地方 context.closePath(); context.stroke(); // 重画时针 context.beginPath(); context.moveTo(0,0);// 从原点开端 var date = new Date(); var hour = date.getHours(); if(hour>=12) hour = hour - 12; var minute = date.getMinutes(); var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360); var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360); context.lineTo(hhx, hhy);// 至时针末端所在地方 context.closePath(); context.stroke(); }; worker.postMessage("");

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var worker = new Worker("js/timer.js");
 
worker.onmessage = function(event){
 
    context.clearRect(-64, -64, 128, 128);// 清空分针和时针
 
    // 重画分针
    context.beginPath();
    context.moveTo(0,0);// 从原点开始  
    var date = new Date();
    var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30);
    var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30);
    context.lineTo(mhx, mhy);// 至分针末端所在位置
    context.closePath();
    context.stroke();
 
        // 重画时针
    context.beginPath();
    context.moveTo(0,0);// 从原点开始  
    var date = new Date();
    var hour = date.getHours();
    if(hour>=12)
    hour = hour - 12;
    var minute = date.getMinutes();
    var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360);
    var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360);
    context.lineTo(hhx, hhy);// 至时针末端所在位置
    context.closePath();
    context.stroke();
    };
    worker.postMessage("");

每过 60 秒钟,后台线程将会上前台线程发送二个空音讯,前台线程接收到音讯后,首先,清空 canvas,然后重新赢妥帖前时间,总括分针以及时针对应的坐标,并再一次画出时针和分针,进而产生对分针以及时针的立异,最后,每过 1 秒钟,表盘更新三回,进而模拟出动态时针的职能,如图 10 所示。

图 10. 时钟

图片 12离线帮衬

即便 Web 操作系统的独到之处是能够利用网络时时刻刻进行探访。但是在不能访谈网络的景况下,Web 操作系统便力所不如发挥作用。因而 Web 操作系统有须求在离线状态下,还可以对部分应用及其作用实行帮忙。事实上,各类浏览器已提供了家常便饭的缓存机制以提供对离线应用的支持,然后那么些缓存机制往往是有时的,不可控的。HTML5 为开辟人士提供了消除此主题素材的另一种路子,它提供了一种永远性的,自定义的缓存方法,使得 Web 操作系统能够在离线的情景下,依旧帮衬部分应用的功效。

HTML5 离线援救的主导是三个缓存清单,当中列出了亟需缓存的文件,本系统中的缓存文件 index.manifest,如清单 19 所示。

清单 19. 缓存清单

XHTML

CACHE MANIFEST #version 1.10 CACHE: index.html js/app.js js/clock.js js/data.js js/database.js js/desktop.js js/history.js js/taskbar.js js/timer.js js/file.js js/utils.js css/index.css images/appHolder1.png images/background.jpg images/clock.png images/close.gif images/computer.gif images/history.png images/network.gif images/recycleBin.gif images/startIcon.png images/taskBar.png images/vidioplayer.gif images/notebook.gif images/text.gif images/save.gif movs/movie.ogg sounds/WindowsLogonSound.wav

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CACHE MANIFEST
#version 1.10
CACHE:
index.html
js/app.js
js/clock.js
js/data.js
js/database.js
js/desktop.js
js/history.js
js/taskbar.js
js/timer.js
js/file.js
js/utils.js
css/index.css
images/appHolder1.png
images/background.jpg
images/clock.png
images/close.gif
images/computer.gif
images/history.png
images/network.gif
images/recycleBin.gif
images/startIcon.png
images/taskBar.png
images/vidioplayer.gif
images/notebook.gif
images/text.gif
images/save.gif
movs/movie.ogg
sounds/WindowsLogonSound.wav

里头,CACHE MANIFEST 标示本文件为缓存文件,#version 1.10 标示了本文件的版本。

CACHE 之后所列项支出的则是开辟职员自定义的内容,当中累积了装有在离线状态下顾客访谈应用程序所须求的公文。

缓存清单定义甘休后,在 index.html 中插入这个清单文件名,那样,当浏览器加载这么些页面包车型客车时候,会自行缓存清单文件中所罗列的文本。

清单 20. 用到缓存清单

XHTML

<html manifest="index.manifest">

1
<html manifest="index.manifest">

值得提的是,若要协助离线缓存,除顾客端浏览器的支撑以外,服务端的帮助也是少不了的,就本系统所利用的 tomcat 而言,须要在其布局文件 web.xml 中增多清单 21 所示的条规。

清单 21. 服务器端缓存配置

XHTML

<mime-mapping> <extension>manifest</extension> <mime-type>text/cache-manifest</mime-type> </mime-mapping>

1
2
3
4
<mime-mapping>
<extension>manifest</extension>
<mime-type>text/cache-manifest</mime-type>
</mime-mapping>

末尾,禁止使用本地机械的互联网,重新展开浏览器并访谈 Web 操作系统所在的网站,系统中的超越一半应用程序仍然得以健康办事,如图 11 所示。

图 11. 离线系统

图片 13结束语

本文介绍了 Web 操作系统的基本知识,并与历史观的操作系统举办了比较,进而介绍了 HTML5 这种新技术为 Web 操作系统开垦带来的好处,并与价值观的 web 前端开拓手艺进行了相比,最终经过创设二个主旨的 Web 操作系统详细的展现了 Web 操作系统的基本格局和效能以及支持其运作的 web 前端开辟技巧是什么贯彻其切实职能的。从本文的商议中能够观看,基于 HTML5 的 Web 操作系统是鹏程的一大趋势,必将渐渐进入大家的平时生活专门的工作中去。

赞 2 收藏 1 评论

图片 14

有关我:新空气

图片 15

简要介绍还没赶趟写 :) 个人主页 · 作者的篇章 · 3

图片 16

《日子流互连网之今后(上)》

例子

XHTML

<body unresolved fullbleed> <core-scaffold id="scaffold"> <nav>Left drawer</nav> <core-toolbar tool>Application</core-toolbar> <div>Main content</div> </core-scaffold> </body>

1
2
3
4
5
6
7
<body unresolved fullbleed>
  <core-scaffold id="scaffold">
    <nav>Left drawer</nav>
    <core-toolbar tool>Application</core-toolbar>
    <div>Main content</div>
  </core-scaffold>
</body>

让咱们一齐来浓密这么些剧情的每一某些

至于俺:梧桐

图片 17

(新浪今日头条:@jakiewoo_vp9) 个人主页 · 我的篇章 · 13

图片 18

何以通过 Vue+Webpack 来做通用的前端组件化架构划虚构计

2016/07/12 · JavaScript · 1 评论 · 前端框架

正文作者: 伯乐在线 - 新空气 。未经作者许可,防止转发!
接待加入伯乐在线 专栏撰稿人。

目录:

  1. 框架结构选型

    2. 架构目录介绍

    3. 架构表达

    4. 招聘音讯

 

眼下要是要说相比较流行的前端架构哪家强,廖若星辰:reactjsangularjsemberjsHTML5振动API的黑心使用,如何通过。avalonjsvuejs

自己个人接触使用过:avalonjsangularjsvuejs。因为工作以及前端团队技术的主题素材,所以在不一致的铺面,在付出专业中选拔了分化的前端架构。

以下仅仅是意味本身个人选取架构的某个见识和理由,如下:

angular:

自己感到angularjs的读书上手周期相比长,恐怕境遇难题,都不或然立时化解,并且编码的成色鲜明的很不佳,若是组织尚未制勘误规,那写出来的代码就无奈看。对于贰个选取angularjs的团队来讲,小编感觉编码标准是很珍视的,不然对编码本领是尚未进级的。

avalon:

avalonjs文书档案资料未有那么全,笔者深感有些开源帮忙的工夫相当不够多。但是,要是有品种供给,须要去做IE浏览器的协助话,小编提出选拔avalonjs

vue:

vuejs 文书档案比较完备,vue摄取了angularjs 的局地亮点,规避了一部分毛病,起码编码标准上有了二个质的飞快,学习上手的周期相当的短。vue开端只是八个轻量级的类库,用来做类似于react的作业,同有时常候vue也是足以拿来做前端架构划虚构计的,举例:vueify

  • vue-router(spa框架)。

vue学习地方:http://cn.vuejs.org/

 

如上说了那么多没用的,上边就来点干活了!

自己的前端组件化架构划设想计,目录如下:

图片 19

品种架构用到的知识点,仍然挺多的,知识清单如下:

[1]:   gulp + webpack 创设打包工具, 使用了一各样的loader,譬喻:vue-loader,  sass-loader, babel-loader , 以及 postcss,postcss-custom-properties,等等

[2]  :   postcss-custom-properties : 用来做样式全局化, 只供给通过变量去爱护,通过编写翻译变量不只能够换肤。

 [3]  :   vue-loader (vue文件组件化):用来去编写翻译管理 *.vue 的文件,一个vue 文件正是三个单独的零件,vue组件开荒具有高独立且易维护。组件的剪切可大可小,三个页面也足以视作成由八个vue 组件构成的,一个页面也能够是贰个vue组件, vue 文件结构如下:

图片 20

[4]  : babel-loader  :达成对vue文件中 es6 语法的编写翻译解析

 [5]  : vue-router :用来做路由分发,并且文书档案特其余全称(学习地点:)。

 [6]  : vue (插件式格局):vue本人提供了一个install 方式用来注入,大家能够注入一些大局的(属性、方法、以及通用的ui组件)。

上边说说文件夹的意义:

  common 文件夹: 是用来存一些通用的事物,举个例子样式,以及全局的js等等

  components 文件夹:用来放独立的零部件,笔者图谋中期做细分,ui 组件,以及page 组件等等,那当中正是团体的脑子,现在就能够做成独立的组件库了。

  filters 文件夹:用来放通用的过滤器操作。

  plugins 文件夹:用来放 Vue.use 注入到Vue全局的插件库,举例:央求加载、弹框、分页、ui组件 等等。plugins 只是把 componets零件揭露给 Vue全局。

  views 文件夹: 用来存放在页面模块

  app.vue 文件:第叁次运维的主程序模块

  app.js 文件:运转前的加载,注入,实例化

  router.config.js 文件:路由模块

 

当下该框架结构在前后台的SPA架构都适用,可能照旧有广大不周密,可是作者还很年轻,vue也还狠年轻,望各位道友多给大家青少年一些空子。

2 赞 6 收藏 1 评论

Facebook Home、HTC BlinkFeed功能、SO.HO……

Instagram 发表了一款基于Android 的吃水应用 FacebookHome,到现行本国外仍不乏好些个媒体赞叹不已MarkZuckerberg的明智之举。固然本身不认为TwitterHome称得起这么大的赞叹,但它却的确地得以说是网络时间流形态很好的事例。本文除了介绍TwitterHome ,还有大概会介绍NokiaSence UI的BlinkFeed、第三方选择SO.HO 以及和互连网时间流理论类似的简要演示 lifestreams.com等。

图片 21

Facebook Home

至于照片墙(TWT兰德酷路泽.US) Home ,PingWest在此以前的几篇小说有过介绍。它是一款Android手提式有线电话机深度定制App,相当于在应用层和系统层中间加了一层。顾客的直白动用感受就是:你的Facebook好朋友图片音信流都会在主显示屏展现,你能够滑动桌面浏览Instagram老铁照片;当有短信、信息或脸谱Message时,可以一直在主显示屏上进展回复、删除、存档等操作;与推特亲密的朋友高谈大论也足以指间接在桌面上实行;别的照片墙Home的 Launcher允许客商挑选多少个最常用的拓宽高效打开或应用。

能够看看,推特已经把网络音信流(独有推特(Twitter)内容)直接推到用户的主显示屏上了,顾客随时都在浏览脸书上的音讯,而推特的Newsfeed恰恰又是一代间流的样式排序的,所以那是叁个非常规范的互连网时间流应用方式。

但网络时间流并不只是newsfeed这一种档期的顺序,它还满含消息流、职分流等更加细分的情节。照片墙(TWTQX56.US)Home也把新闻流很好的给客户展现出来了,但做的并不全面,并且TwitterHome终归只是推特一家的制品,以往客商桌面包车型地铁互连网时间流会集成推特、Twitter、London时报、邮件等丰富多彩的内容。具体有怎么着,完全信赖客户增加。

HTC Sence UI的BlinkFeed 功能

春天中下旬,当见到中兴 Sence 5.0上的BlinkFeed 作用之后,小编的心怀十分感动,那正是网络时间流的着实表现情势。BlinkFeed将你的争持互联网、新闻资源音讯、生活娱乐、照片录制等各个音讯涸泽而渔,直接在你的主显示屏上海展览中心示出来。BlinkFeed的消息源来自大地1400多家媒体和网址,同期还是能显得日历等客商音信,基本满意了为此客户的须求。

大概过几个人并不习贯那样的浏览格局,何况直接把互连网新闻推送到桌面上,对网速、手提式无线电话机续航、内部存款和储蓄器等也是二个压力。并且假若订阅的音讯流相当多来讲,便会产出音讯爆炸的景观,导致顾客根本看可是来。不过这么些主题素材都有各样措施来消除或优化,最后一章大家会详细介绍。

Samsung的 Sence UI本人就不易(今后手提式有线电话机也愈加美好了),而在二哥大的互相设计上,这家商城也更大胆。BlinkFeed 这种方式就算未来还某些超前,但随着系统的不停迭代,今后会愈加相符大家的选用习贯。

lifestreams.com

lifestreams.com是一个互连网时间流概念的一个轻松Demo,它本人也是基于大卫Gelernter的辩护设计的。其使用了谷歌 Glass 的 Timeline Card格局,并依据时间流排序。大家在前一章也介绍过,Timeline 卡德这种样式特别符合智能时钟、老花镜或任何的小显示器设备,但在四哥大或平板上这种呈现格局并不妥贴。

lifestreams.com 就算严谨凭仗大卫Gelernter的岁月流互连网概念,但如故太偏理论。可是这种情势基本上给出了以后互连网信息突显形象的宗旨样式,以后的网络消息流会以此为基本情势开展各样越来越高档的嬗变。

其三方接纳SO.HO

SO.HO是一款Android App,准确地说,是一款Android运行器(Launcher)。在谷歌Play上线也独有二个月左右的时刻,和FacebookHome大概,SO.HO也是令你在显示器上直接呈现Facebook上的内容,同一时间还援助Facebook。产品做得很糙,但现已有一点点今后的野趣了。

SO.HO上线二日,GooglePlay下就有人评论说:“能够增添Google+、多账户twitter、Foursquare、脸谱、tumblr、汉兰达SS”。明显,大家想得都同一,大家得以把手机桌面上塞满各样大家想要的音讯……

正如前方在BlinkFeed 这段大家关系的同样,把持有音讯都坐落三个显示器上显著非常不可相信。我们理应对其开展客观的归类,举例应酬音讯、音讯资源音讯一个显示器,短信、消息、邮件等贰个显示器,专门的事行业内部容(职业索要)的东西再放叁个显示屏(如HUAWEI10的Balance生活职业切换效能),那样就归纳多了。

 

有关作者:周进林

图片 22

茫茫大海中的一枚技士,为了提升为多个男神人类而拼命着。关心java、python、linux、vim等(乐乎今日头条:@酒肉和尚--进林) 个人主页 · 笔者的稿子 · 20 ·  

图片 23

虚假来电

要是与HTML5 奥迪o一同行使,完全能够创设四个很真实的假冒伪造低劣”来电“,既有震惊也许有铃声。一旦”接听“,页面就足以播放一段音频:”喂,尽快回打给本人,作者的数码是“二个吸费号码”。接下来还足以采用UCRUISERI自动展开拨号分界面。

图片 24

(图2)

您能告诉小编上边说的是实事求是的来电吗?假使您够细致恐怕会发觉。但借使页面正在播放你的暗中同意铃声,然后设备还在震憾,那时你就很恐怕迷糊。如果和WebRTC呼叫绑定,那其实你看看的正是三个缜密布局的圈套。

手提式有线电话机、谷歌(Google) Glass、智能原子钟、平板、TV……

运动网络的前行,不唯有让网络时间流性格尤其旗帜显明、音信更是扁平化,同不经常间对于经常群众来讲,最大的成形就是多屏化趋势、以及各类显示屏新闻扁平化表现格局的转换。而那最体贴的三个缘故,就是互连网从PC 走向手提式有线电话机、TV、石英表等物联网时期的各个设备。本章大家就介绍一下各类大小的显示屏中间的距离、互联网内容在那些设施上的展现情势。

图片 25

在网络还仅局限于PC 上此前,行业内部就有第一荧屏(电视机)、第二显示屏(手机)、第三显示器(PC)等等的传教。后来乘机科学和技术的发展,手机日渐产生了第一显示屏,平板兴起并开头和TV争夺客厅的掌握控制权,而石英钟、近视镜也成了新兴显示器,更别提Nest、三门冰箱、微波炉这一个小显示屏了。

智能手提式有线话机

挪动互连网的向上,已经让智能手提式有线电话机成为了PC之外包容网络内容最优的器具,今后的网络内容表现情势和当今出入也不会太大。但手提式有线电话机的演变,也会使得以往大家应用手提式有线电话机的办法有一点不相同。

第一,手提式有线话机显示屏越来越大,从3.5英寸到4英寸,从4英寸到5竟是5.5英寸,大家开首逐步接受大显示器。显示器一大,自然显现的音信就多,非常多掩蔽的很深的音信便得以一贯放到桌面上,比如天气、音讯、种种小插件等。那切合互联网时间流的变迁,信息层级变浅,越多内容聚合到桌面上。

其次,触屏手提式有线电话机的流行,使得以后语音、智能传感器(如眼动仪、距离感应器等)得到进步。现在只需对早先提式有线电话机说句话,它就可以告知您任何音讯,你不用去张开某款App,设备就足以自动从网络上找到您想要的事物。新闻更为扁平,HTML5网址内容可径直表今后大哥伦比亚大学显示屏上。

平板计算机

机械Computer的风靡也就这两七年的事(2009年surface第一代宣布),就算事先也会有种种Pad 概念和设施。平板三番四次了智能手提式有线电话机的操作系统,导致其易用性也比PC越来越高。比较PC 这种生产力工具,平板更疑似叁个生活设施,而多数家园须求的,也只是用来休闲娱乐的活着设施。

进而全部上,平板和智能手提式有线电话机大概,在互连网内容包容、内容突显格局、人机交互等地点都曾经特别成熟了。随着网络时间流的扁平化,未来的猛烈更疑似几个音讯流自动突显平台。

智能电视

电视从前是客厅的霸主,今后机械的出现让大伙儿在厅堂也是有了别的的事体可做,但智能TV很有比非常大可能率挽救这种范围。和平板同样,智能TV也是多少个互连网的时刻流呈现平台:全部内容在群众不看电视的时候自动滚动一些音信,比如天气、音信、社交亲密的朋友照片、新音信、分享内容等。并且智能TV的视讯系统和手势操控,能分别调控大厅录制通话和娱乐这两大系列,在电视前和家属录像聊天、玩游戏是再自然然而的事了。

在网络消息流体现情势上,彩电比较平板其表现内容越来越少(纵然显示屏大但距离远),所以电视机上的情节更偏侧于前边的要讲的老花镜,即卡片式呈现。除了语音和手势调节,TV上都以以大块内容突显的,举例二个电影海报可能就占有了半个显示器,一场球赛直播或然就据有了3/4竟然越多的显示器。但从眼下智能TV的分界面设计看,还并未有做的很好的表现格局。

智能老花镜(谷歌 Glass)

就算如此本段大家以谷歌Glass为例,但此处要评释的是:智能近视镜并不单独指GoogleGlass这种情势。GoogleGlass在智能近视镜研究开发上做的很好,但不排除以往会有任何的样式(比如Vuzix 的斯马特 Glasses M100),而且微软、索尼(Sony)、Bluester 等竞争对手的参与,大概也会让智能近视镜领域具有更加的多种性的生态。

在网络时间流概念上,谷歌(Google) Glass 的新闻表现格局能够说是最卓越的了:Timeline Card 。Glass 的种种音信都以一个小卡牌,并以时间为排序情势。卡牌上能够显得天气、时间、照片、短音讯、录像通话等等,Google把互连网内容进行掌握释,社交亲密的朋友的一条状态、照片墙上的一张图片都只放在一张卡牌上,这样消息更为聚集,也不会给客户变成烦懑。

谷歌Glass的这种“时间流卡片”的显得格局得以用在无数配备上,比方智能电视、智能钟表、三门双门电冰箱、滚筒洗衣机、Nest智能家居检验仪等。由于可是荧屏丰盛小,所以这种格局相比相符。并且HTML5的跨平台湾特务性,也能让网络财富在那些小显示屏设备上很好表现。

智能石英表

智能手表有看不完,它大概也会像智能老花镜一样成为各大科学技术厂家的战术性产品,何况由于智能钟表门槛要比老花镜低,或许更会有一堆小厂家也涌进来。假诺大家拿Pebble 为例,就足以知晓钟表显示器十分小,只好显示相当少的内容,所以Timeline Card的方式也适用,在此大家就十分的少说了。

但智能钟表和智能近视镜都面前蒙受着雷同的二个主题材料:由于体量太小,导致硬件受限,很难支付八个独自的操作系统,只可以通过连日到手提式有线电话机成为一个荧屏。(尽管GoogleGlass是独自运营的,但前途不保险其余近视镜也能一蹴即至这一难点。)

PC

互连网正是在那上边诞生的,PC 的价值无可争辩。但科技(science and technology)的升华,已经让PC渐渐退居二线了,我们今日多方操作都能够在移动终端上完结,以后也不保证不会全盘吐弃PC 。有的人讲,今后的PC 不该叫PC 了,应该叫WC (Work 计算机)。确实,PC 以后多数成为了四个生产力工具,大家下班之后基本都不会摸计算机了,更何况对于父老子女还十一分难用。

 

键盘导航

键盘协助的首要不仅是为着便于的寻访,它同样会使SPA客户刚到更开玩笑。

<core-a11y-keys>是多少个规范化浏览器键盘事件的放到组件。它能够在您的运用里增多键盘支持。这里有一个例证:

XHTML

<core-a11y-keys target="{{parentElement}}" keys="up down left right space space+shift" on-keys-pressed="{{keyHandler}}"></core-a11y-keys>

1
2
3
<core-a11y-keys target="{{parentElement}}"
keys="up down left right space space+shift"
on-keys-pressed="{{keyHandler}}"></core-a11y-keys>

假冒伪造低劣来电:HTML5振动API的黑心使用

2014/01/16 · HTML5 · 3 评论 · HTML5

本文由 伯乐在线 - 梧桐 翻译。未经许可,防止转发!
克罗地亚语出处:Terence Eden。招待到场翻译组。

贰个新的API出来了。HTML5 (一点也不慢)将帮助客户设备振动。那明摆着是很有趣的作业,比方它可以顾客触发提示,升高游戏体验,以及另外各样风趣的事务,比如经过振动发送摩斯代码。

到最近结束,Chrome(以及别的Android浏览器)要利用地点消息、录像头、地址簿等财富必得申请权限。那是一种安全措施防卫你的个人信息在未授权的意况下走漏。

而现在使用HTML5振动API并不会在显示器上触发警告。因为相似感觉用那几个意义大约平素不挫伤,究竟在切实可行中它能干的坏事无非是绵绵消功耗量。事实就是这么总结吗?笔者不敢显明。

编辑:美高梅游戏网站 本文来源:HTML5振动API的黑心使用,如何通过

关键词: