云顶集团400800044

当前位置:云顶集团400800044 > 云顶集团400800044 > Mobile做HTML5平移应用的五个优劣势【云顶娱乐平台

Mobile做HTML5平移应用的五个优劣势【云顶娱乐平台

来源:http://www.ofertasanjuan.com 作者:云顶集团400800044 时间:2019-10-08 07:32

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

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

本文由 伯乐在线 - 梧桐 翻译。未经许可,禁止转发!
印度语印尼语出处:Terence Eden。应接到场翻译组。

一个新的API出来了。HTML5 (异常的快)将接济客户设备振动。那分明是很旧事体,比如它可以客户触发提醒,提高游戏体验,以及任何各类有趣的作业,例如透过振动发送摩斯代码。

到方今甘休,Chrome(以及别的Android浏览器)要采纳地方消息、录像头、地址簿等资源必需申请权限。那是一种安全措施防止你的个人音讯在未授权的事态下走漏。

而现在使用HTML5振动API并不会在显示屏上触发警告。因为经常感到用这么些功能大致未有伤害,毕竟在具体中它能干的坏事无非是任何时间任何地方消功耗量。事实就是如此总结吗?作者不敢肯定。

风趣的CSS标题(12):你该知情的字体 font-family

2017/01/06 · CSS · 1 评论 · 字体

正文作者: 伯乐在线 - chokcoco 。未经我许可,禁绝转发!
应接参加伯乐在线 专栏撰稿人。

微小的书体其实有大大的学问,只怕与字体相关的数不完文化都偏设计,但是俗话说技多不压身,艺高胆大,多精晓精通放区救济总会归没有错。

云顶娱乐平台注册 1

用jQuery Mobile做HTML5平移采纳的多少个优短处

2013/03/30 · HTML5 · 来源: 伯乐在线     · HTML5

马耳他语原稿:Niall O’Higgins,编写翻译:伯乐在线——唐尤华

在过去大致二个月的光阴里,作者直接在行使JQuery Mobile为三个强健身体培养练习网址开拓基于HTML5的无绳电话机/平板前端选择。我事先曾经写过Android和iOS应用程序(分别用Java和Objective-C),由此假诺编写一段基础代码就足以在主流平台上运转并能够神速地用HTML和JavaScript迭代,那样的允诺十一分迷人。

JQuery Mobile & HTML5

接纳HTML5和JavaSript营造三个手提式有线电话机应用,你须求写非常多JavaScript代码。可是,带有触摸屏的器材的UI调节和管理与专门的学业的Web应用程序特别分歧。由此,你会想要使用现存的无绳电话机HTML5/JavaScrip框架(除非你有大多的时日还要策动将享有东西重新营造)。以后有广大现有的框架可供接纳:jQTouch、 Sencha Touch 等等。

自己产生JQuery的观者已经比比较多年了,越发欣赏它的至简军事学以及卓绝的中央本性和插件以及社区的进献。正是出于有JQuery,笔者才基本上能用使用JavaScript开辟。所以,当听见 Chris McDonough(Pyramid Python Web 框架的撰稿人)发表JQuery的好消息时,小编明白笔者应当去试一试。

 

JQuery Mobile 和 HTML5 的 3个优点

1. 上手急忙并辅助高效迭代:在叁个礼拜多或多或少的时光里,通过阅读JQuery Mobile文书档案以及O’Reilly出版的JQuery Mobile书籍,作者实现了三个得以干活的app初叶版本。从前小编向来不HTML5 / JQuery Mobile开拓经历。与Android和iOS相比较,使用JQuery Mobile和HTML5创设你的UI和逻辑会比在原生系统下塑造快得多。

Mobile做HTML5平移应用的五个优劣势【云顶娱乐平台注册】,HTML5振动API的恶意使用。译注:原生系统:原装的操作系统,举例Android原生系统是谷歌(Google)宣布未经修改的种类。在本文中,原生应用指直接用系统提供的API开拓的顺序,与JQuery Mobile开垦的前后相继相呼应。

自家开掘Apple的Builder接口的上学曲线特别陡峭,一样学习令人费解的Android布局连串也很耗费时间间。别的,要利用原生代码将贰个list view连接到远程的数据源并保有杰出的外观是十二分复杂的(在Android上是ListView, 在iOS上是UITableView)小编力所能致透过已经调控的JavaScript和HTML/CSS知识快捷地贯彻均等的成效,不要求学习新的adapter,delegate等等抽象概念,只要编写JQuery代码就足以做到。

2.制止麻烦的行使市肆审查批准进程以及调整、创设带来的伤痛:为手机支付使用,尤其是iOS系统的无绳电话机,最惨重的长河实际上通过Apple应用市肆的审查批准。想要让三个原生应用程序揭橥给iOS客户,你要求静观其变一个十分长的经过(须求一些天,乃至大概是一些周)。不只有在第壹次揭橥程序时要经历魔难,今后的每一回提高也是那样。那使得QA和公布流程变得复杂,还有恐怕会扩张额外的小运。由于JQuery Mobile应用程序仅仅是一种web应用程序,因而它三番两次了全部web景况的优点:当顾客加载你的网址时,他们就马上“晋级”到最新的本子。能够马上修复bug和丰裕新的性格。即便是在Android系统——应用市镇的渴求比起Apple际遇要宽松得多,在客商无声无息中落成产品进级也是一件很好的事体。

越是的益处是,公布beta或测量试验版本会愈发便于。只要告诉客商用浏览器张开你的网站就能够了!无需思考iOS令人抓狂的DRM,也无需理会Android必得的APK。

3.支撑跨平台和跨设备开销:贰个光辉的实惠是,小编的应用程序立时能够在Android和IOS上干活,一样也足以在别的平台上工作。作为一个独门开垦者,为不一致的平台维护基础代码是一项巨大的行事。为单个手提式有线电话机平台编写高素质的无绳电话机使用要求全职职业,为各样平台重复做类似的事体需求大批量的财富。应用程序能够在Android和IOS设备上同期工作对自身来讲是一个硬汉收获。

更进一竿,特别是对于运营Android各类分支的设施,它们大小和造型各异,想要让您的应用程序在美妙绝伦显示屏分辨率的手提式有线电话机上看起来都没错,那是确实的挑战。对于要求严俊的Android开拓者来讲,依照显示器大小进行设显示屏分割(从一丝一毫最小化到最大进展缩放)会需求多多耗时。由于浏览器会在各类设备上以同等的措施表现,关于那么些方面你不要有别的忧郁。

 云顶娱乐平台注册 2

 

JQuery Mobile 和 HTML5 的3个缺点

1.比原生程序运维慢:在小编眼里最大的劣势是,纵然是在最新的Android和iOS硬件上(双核Tegra 2 Android手提式有线电话机,双核苹果平板2机械),JQuery Mobile应用程序都会显然慢

于原生程序。特别是在Android上,浏览器比起iOS更加慢且bug越多(固然Google是专一web领域的市廛)。小编未有在更早的Android设备上测验自个儿的次第,大概根本就不能够运作(举例Android G1)。笔者深信不疑在今后的12-2四个月,硬件速度会非常快获得提高(举个例子,四核设备二〇一二年即时就要上市),品质只怕非常的慢就不会成为难点。然则明日,它真的是三个败笔。纵然你只专一于iOS,你大可以期望一下浏览器的性质,最少它在那上头是有限帮助的(不像Android,Moto河井青叶等等)

2.千奇百怪(跨浏览器、跨平台支付):JQuery Mobile以后仍是beta版本,由此笔者遇见了成都百货上千bug。约等于说,JQuery共青团和少先队还在积极地卷土而来GitHub上建议的主题材料。小编感到个中最大的三个标题是各个浏览器在差别的手提式有线电话机平台上奇特的表现。那些标题直接为人指斥。应用程序恐怕看起来有个别奇怪——即使本人觉着JQuery Mobile团队在widget和宗旨上做得很棒,但的确和原生程序看起来有赫赫有名的例外。那几个标题毕竟对顾客有多大影响没有办法知道,不过那或多或少内需引起注意。

3. 有限的技能 vs 原生程序:很显著,运维在浏览器上的JavaScript不可能一心地寻访设备的洋洋风味。二个超人的例证正是录制头。不过,类似PhoneGap那样的工具能够帮忙消除广大周围难题。实际上,作者已经伊始将自身的应用程序通过PhoneGap将多少个本子安插到iOS和Android上,使用的是原生Twitter(Facebook)绑定,效果令笔者印象深刻。小编会在未来的博客中写一些运用PhoneGap的阅历。

 

总结

同理可得,笔者以为采纳JQuery Mobile和HTML5作为手提式有线电话机接纳开拓平台是行得通的。不过,那并不适用于(起码到近期截至)全体种类的应用程序。对于简易的源委体现和数目输入类型的应用程序(相对的是亟需充裕多媒体/游戏程序),它是对原生程序八个精锐的拉长。作者对和谐的应用程序使用新平台的结果认为欢快——不再须求同偶然间为Android和iOS维护自个儿的健身追踪软件。

在接下去的1-2年中,随着硬件变得更加快,手提式有线电电话机配备进而多样化,笔者深信不疑HTML5 (JQuery Mobile, PhoneGap, 等等)在四哥大应用开采中会成为进一步关键的才干。

 

韩语原来的作品:Niall O’Higgins,编译:伯乐在线——唐尤华

【如需转发,请在正文中标明并保留原作链接、译文链接和翻译等新闻,多谢合营!】

 

赞 收藏 评论

李秉骏:在Phonegap下实现oAuth认证

2012/07/18 · HTML5 · 2 评论 · 来源: 李秉骏     · HTML5

正文由李秉骏(@CashLee李秉骏)投稿于伯乐在线,也接待任何朋友投稿。提醒:投稿时记得留下天涯论坛账号哦 云顶娱乐平台注册 3

近期做过两遍关于Phonegap的现场交换会议分享。基本上把Phonegap的一些特点和我们沟通了一晃,我们对于Phonegap的 兴趣也是十分的多的。不过因为Phonegap相对于原生应用来讲,独有叁个View,这些View正是贰个Web的容器,那使得Phonegap就存在比非常多限制。在那之中部分的限制大家曾经经过HTML5的API以及Phonegap为大家搭建的桥去达成了,其他一些大家就得经过Phonegap plugins来落到实处,而实质上本人个人认为Phonegap最强劲的地点也在于有那么大的一个部落在为她提供五光十色的Plugins,以便去应对实际项 目中境遇的难题。

本身纪念在和大家沟通的时候我们经常会问Phonegap如何是好地点的缓存啊(WebSQL),怎么样近乎原生应用(那些涉及到架构,分界面渲染难点,这 里自个儿也糟糕深切讲,毕竟不是本文要商量的从头到尾的经过),还可能有二个很头痛的主题材料就是假使要做三个开放平台的施用,如何促成oAuth认证。以前自家也遇上过类似的一 些情状,当小编再次相遇这几个老灾荒的标题标时候,笔者信赖确定也会有Phonegap的客官遇到类似的情事的。于是本人就计算下来何我们探究一下哪些消除那么些题目吧。

首先指标:消除oAuth认证。

拟虞诩顿:1. 知道oAuth原理;2.明白Phonegap在拍卖这些标题时候的运转搭飞机制;3. 制定安排落到实处代码。

下边大家就来一步一步地剖判,看怎么化解那一个情景吧。(因为笔者在档案的次序中境遇的是Tencent今日头条开放平台的oAuth认证,那么上边笔者就用TencentoAuth认证为例吧)

有关oAuth认证,相信做过开放平台应用的相爱的人都已非常熟练了,假如您还并未做过恐怕对于oAuth认证流程特别不通晓,那么小编提出您先明白一 下原理,在此处自身不希望花太多的篇幅去介绍那几个事物,因为在不计其数地点都可以找到,上面小编引入五个地点方便大家去阅读,必得求读书,那会对您精通下边包车型地铁文章有惊人的扶持的。

Tencent今日头条开放平台:

微博新浪开放平台:

当然在这里上边供给阐述表明的是oAuth认证机制是叁个通用的手段,可是因为种种开放平台有和好的宗旨,因而或许在里面稍有改观,况兼最后获得的权位也会各分化。而前段时间天涯论坛天涯论坛实在太多坑爹的工作了,实在忍受不住,于是笔者转战到Tencent的阳台了。

好的,假让你看完了oAuth认证的流水生产线,就直接到此处来。有目共睹,在oAuth认证的流程中,有叁个授权页面,而这些授权页面是经过开放平台提供的,具体的体裁见下图:

云顶娱乐平台注册 4

其一页面用于输入开放平台的帐户以及密码,通过授权获取响应的openid以及openkey,最终换取access-token(待会笔者会结合微博易oAuth认证流程的风味,以及代码和豪门剖判的)。

其一页面是弹出的,若是在Phonegap里面做的话会很想获得:1,因为属于弹窗,在Phonegap中自身正是多少个WebView假设你还弹的话 就能够飞到了Safari的浏览器中,那就跳出应用自己,跳出来认证还应该有戏呢?2,通过iFrame,首先体验非常不佳,其次iFrame本人又属于跨域的 难点,这就不佳化解了(为何体验不佳呢,首如若因为授权页面包车型客车样式是不牢固的,类似Tencent今日头条开放平台,就比腾讯网的授权页面做得差,根本不和手提式有线电话机宽容的, 何况有个别做得好的,认证页宽度正是320px,就占了您全体应用的版面,体验相当倒霉)那么Phonegap中该如何贯彻吗?

带着主题素材,大家就指望在Phonegap中另行引入二个WebView。刚刚提到Phonegap的兵不血刃还在于很三人以及法定的团组织,为其提供了一 套很好的插件机制,以解决各式各样的必要。在Phonegap中有二个插件叫做ChildBrowser,从名称想到所包含的意义正是:子浏览器。(其实自身在上五回的 Phonegap专项论题本事分享中以及谈起到让我们用这么些事物去消除,但是当下享受时间少于只可以够草率带过,抱歉)子浏览器的功能其实便是令你在 Phonegap应用内部调起一个浏览器的View,让您进行pdf,图片,录制,以至网页阅读的工具。(实际上你看本身下面的截图,便是用 ChildBrowser来达成的)那就好了,那就能够让你调起浏览器並且不跳出应用自身了,能够很好地化解oAuth认证的主题材料。 ChildBrowser下载地址:

在地方上边,你应有早已见到ChildBrowser的设置格局以及接纳方法了,极度简单,真正的即插即用。假使您以为克罗地亚语太难,那自身就帮不了你 了,你就自动Google翻译一下呢。相信您连忙就足以做出二个ChildBrowser的德姆o的。在这几个地址上面,其实您回到上一层目录,其实你也 已经观看五颜六色的Phonegap Plugins,通过这一个东西,你还能调用起手提式无线电话机内部愈来愈多风趣的财富的!这么些就要靠你本人去发掘啦!(别的平台的使用也许有对应的插件的Android开荒者不要骂果粉哦!)

好了逐月地我们将在涉及到代码部分了。首先大家看看调用ChildBrowser的Javascript代码:

JavaScript

cb = window.plugins.childBrowser; /* if(cb != null) { cb.onLocationChange = function(loc){ root.locChanged(loc); };//地址发生变动时候推行的函数 cb.onClose = function(){root.onCloseBrowser(); };//通过js关闭ChildBrowser的措施 cb.onOpenExternal = function(){root.onOpenExternal(); }; */ cb.showWebPage("");

1
2
3
4
5
6
7
8
        cb = window.plugins.childBrowser;
/*
        if(cb != null) {
        cb.onLocationChange = function(loc){ root.locChanged(loc); };//地址发生改变时候执行的函数
        cb.onClose = function(){root.onCloseBrowser(); };//通过js关闭ChildBrowser的办法
        cb.onOpenExternal = function(){root.onOpenExternal(); };
*/
        cb.showWebPage("http://google.com");

里头cb就是初阶化的ChildBrowser,而showWebPage就是调起那几个页面包车型地铁措施。可知代码中要展开的网站正是谷歌.com啦,那么些地球人都能够看得懂了。于是大家就能够即时想到大家要用ChildBrowser展开的网站是大家在互联网钦定的采用授权站点 了。而自个儿是陈设在SAE上面的,所以上面包车型大巴例子也用PHP来讲呢,期望语言也是同一的道理,转义就足以了。在说代码以前,大家先来讲说现实通信的流程,以 及我们接下去要完结的对象。

云顶娱乐平台注册 5
在那边,我们的手提式有线电话机端是经过拜谒SAE服务器,由SAE服务器管理数据并与博客园易开放平台通信的,这里手提式有线电话机端并不曾直接和Tencent天涯论坛开放平台通信(作者这么 管理的来由是1,方便在劳务器端管理帐户,这样的话能够观测本人的选取的帐户处境;2,服务器端完毕推送机制,方便管理token以及做api;3,服务 器端还足以和任何开放平台帐户绑定)。因而,大家的百分之百认证方案会在服务器端达成。

而据说Tencent和讯开放平台,大家先是会在开放平台下边注册本身的施用,注册的流程以及艺术本人不说了,注册的地方是:,注册你的利用后,你对号入座能够获得的东西是:

JavaScript

行使名称:mobile_test_api 应用项目:顾客端应用 App Key:88888888 App Secret:ainidenideiienfeomeomroemrome

1
2
3
4
应用名称:mobile_test_api
应用类型:客户端应用
App Key:88888888
App Secret:ainidenideiienfeomeomroemrome

在此地自个儿的App key以及App Secret是假的(你懂的,你应当有你和煦的),上边大家就采纳Tencent提需要我们的PHP SDK,下载地址:。有了SDK后大家就足以把SDK放到自个儿的条件方面,然后配置服务器端的代码了。下图是小编回顾布置的服务端的代码,lib下寄放的便是Tencent和讯的sdk。当然实际生产条件和这么些有两样。这里仅仅作为示范使用:

云顶娱乐平台注册 6

上面就遵照Tencent新浪认证的流水生产线,逐条解说一下那个文件以及中间的代码吧。

index.php

PHP

<?php require_once 'app_config.php'; $url=" header('Location:'.$url);

1
2
3
4
5
6
<?php
require_once 'app_config.php';
 
$url="https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=".$client_id."&APP_KEY=".$app_key."&wap=2&response_type=code&redirect_uri=http://yoururl.com/get_auth.php";//指定URL地址
 
header('Location:'.$url);

此处引进的app_config.php

PHP

<?php $client_id = '8888888888'; $app_key = 'anienineiienrieireowq2839289';

1
2
3
4
5
<?php
 
$client_id = '8888888888';
 
$app_key = 'anienineiienrieireowq2839289';

因为根据Tencent博客园开放平台,大家第一步要得到的是Code,如下所述,大家要做的正是加强布署,获取这么些Code

JavaScript

第一步:央求code 诉求方法: GET 央浼地址: 再次来到结果: 假使授权成功,授权服务器会将客户的浏览注重定向到redirect_uri,并带上code,openid和openkey等参数,重定向的url如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
第一步:请求code
 
请求方法:
GET
 
请求地址:
 
https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=APP_KEY&amp;response_type=code&amp;redirect_uri=http://www.myurl.com/example
 
返回结果:
如果授权成功,授权服务器会将用户的浏览器重定向到redirect_uri,并带上code,openid和openkey等参数,重定向的url如下:
 
http://www.myurl.com/example?code=CODE&amp;openid=OPENID&amp;openkey=OPENKEY

具体要求央求附带的参数,须求求安分守己oAuth2.0鉴权的页面提醒的实行。()

然后大家再来看看大家所布置的文本:

get_auth.php

PHP

<?php require_once 'app_config.php'; $code = $_REQUEST['code']; $openid = $_REQUEST['openid']; $openkey = $_REQUEST['openkey']; $url = ""; $message = file_get_contents($url); /* success to print the access token message */ $access = explode("=",$message); print_r("<br />"); $access_message = explode("&",$access[1]); $access_token = $access_message[0]; $user_name = $access[4]; print_r($access_token ." " . $user_name);

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
<?php
 
require_once 'app_config.php';
 
$code = $_REQUEST['code'];
 
$openid = $_REQUEST['openid'];
 
$openkey = $_REQUEST['openkey'];
 
$url = "https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id=".$client_id."&client_secret=".$app_key."&grant_type=authorization_code&code=".$code."&redirect_uri=http://yoururl.com/get_auth.php";
 
$message = file_get_contents($url);
 
/* success to print the access token message */
 
$access = explode("=",$message);
 
print_r("<br />");
 
$access_message = explode("&",$access[1]);
 
$access_token = $access_message[0];
 
$user_name = $access[4];
 
print_r($access_token ."   " . $user_name);

实质上到以上停止,我们的配备文件已经弄好了。在这一个布局文件中,实际上大家要做的便是Tencent天涯论坛开放平台北聊到的第二步:

JavaScript

其次步:央求accesstoken 乞请地址: 再次来到结果: 再次回到字符串: access_token=ACCESS_TOKEN&expires_in=60&refresh_token=REFRESH_TOKEN

1
2
3
4
5
6
7
8
9
第二步:请求accesstoken
 
请求地址:
 
https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id=APP_KEY&amp;client_secret=APP_SECRET&amp;redirect_uri=http://www.myurl.com/example&amp;grant_type=authorization_code&amp;code=CODE
 
返回结果:
返回字符串:
access_token=ACCESS_TOKEN&amp;expires_in=60&amp;refresh_token=REFRESH_TOKEN

假使您以往早就配备好你的劳务端口,已经配备好手提式无线电话机端的ChildBrowser,你就已经能够在手提式有线电话机方面看看整个认证的流水生产线了。今后的干活早就完结了绝大比很多了,但是留心的仇人大概会发觉,对呀,认证是实现了,手提式有线电话机上或许尚未得到授权啊,因为授权后的音讯还不可知通过手提式无线电话机去赢得。不要 急,ChildBrowser风趣的地方还尚无完呢。在小叔子大端方面大家完结了oAuth认证,总有一对参数再次回到,不管accesstoken是不是留存手提式无线电话机端,你无法不有个帐户机制和服务端通信。笔者的服务端在SAE上边,笔者就营造二个独一id给手提式有线电话机,于是小编就创造了贰个帐户机制,存在服务端上,服务端上囤积的东西是:

MySQL

CREATE TABLE IF NOT EXISTS `auth_user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `muser` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `openid` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `openkey` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `auth_user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `muser` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `openid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `openkey` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

其实这一个表也还未曾宏观,笔者必需还要纪录这么些顾客是或不是在线(倘若有推送机制)。此后手提式有线电话机端和服务端通信就通过上边的id以及token等的消息进行通信,再经过服务端想腾讯和讯开展api的简报,获取我们想要的新闻。那么注明后大家通过怎样路线获得表达后归来的消息呢?我们看看上面JS调整ChildBrowser的代码。会发觉里头有二个艺术:

JavaScript

cb.onLocationChange = function (loc){ console.warn(loc); };

1
cb.onLocationChange = function (loc){ console.warn(loc); };

设若您在xCode下边跑这段代码的话,你会发掘loc打出去的是每一趟ChildBrowser里面浏览的网页改动的地方。那年大家就足以因时制宜,依据这里提供的不二法门,用url的不二等秘书籍把地点重返到Phonegap负担逻辑管理的JS代码中,同期将相关必要通信的音讯也回到。重返后还足以经过回 调的办法实践关闭ChildBrowser的代码:

JavaScript

cb.close();

1
cb.close();

本来,你还足以实行越来越多异步央求的代码。至于说还可以通过怎么样的法子实行报纸发表其实还应该有相当多艺术,小编这里仅仅是提供一下思路教导以及艺术。具体的 话,还要进行出真理论,做到特别安全的通信还值得我们接二连三深远研讨。那么自身要介绍的大约就到此处结束。因为其实项目中大家还应该有push notification的体制,所以后来小编应当还有可能会联同@Jeff_Kit 完结一下Phonegap的推送方案,并整理出sdk,成文后开放出来方便大家调换。

对于本文要是有哪些难点依然提出都能够平素向小编报告,我的微博新浪是:@CashLee李秉骏 ,作者还日常分享部分代码片段在github上面(开源的生气比较少,所以开源项目非常少,希望以往净增吗。)笔者的Github账号, 迎接您和小编随时开展沟通,也指望Phonegap的神州开拓者社区会变得尤其赏心悦目。

小心:ChildBrowser控件在实际上条件中因为安全主题素材大概供给修改,通信进度中参数也提议加密。:-)

 

本文由李秉骏(@CashLee李秉骏)投稿于伯乐在线,也接待任何朋友投稿。提醒:投稿时记念留下天涯论坛账号哦 云顶娱乐平台注册 7

【如需转发,请标明并保存原作链接和小编等消息,多谢协作!】

 

 

1 赞 收藏 2 评论

云顶娱乐平台注册 8

故事 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的测算及存储能源,客户数据保存在劳务器端,安全性较高。

云顶娱乐平台注册 9

有关才具

此时此刻营造 Web 操作系统的前端技能首要有 Flex、Silverlight、ActiveX 插件等等,它们各有一部分优弱点。

Flex

Flex 是一个地利人和的富客商端应用框架,潜心于页面展现,Adobe 专门的工作维护,统一牢固,何况其脚本语言 ActionScript3 是面向对象的,特别契合程序猿使用。劣点则是功耗高,占用带宽多,对活动采用的支撑性差。

Silverlight

Silverlight 是由微软生产的用于跟 Flash 抗衡的 RubiconIA(富网络使用)应用方案,优点是负有硬件级的加速功效,但它近些日子仍不成熟,对非 Windows 系统的协助性并远远不足好,且学习难度很大。

ActiveX 插件

ActiveX 插件一样是微软生产的 WranglerIA 设计方案,它是一个绽开的消除方案,能够包容五种语言,可是它的缺点也是肯定的,客商必要调动浏览器的平安品级并下载插件本事运作 牧马人IA 应用,不小地回降了安全性。

HTML5

为推进 web 标准化运动的上扬,W3C 推出了下一代 HTML 的规范 – HTML5,为无数的商城所扶助,因而有着天时地利的前景。它有以下特征:首先,为巩固客商体验,强化了 web 网页的展现质量;其次,为适应 翼虎IA 应用的发展,追加了本地数据库等 web 应用的功用;再度,由于高度标准化以及大多浏览器商家的全力协助,它的兼容性和安全性极高;最终它是一种轻松的语言,轻易为左近开采者精通。更为可贵的是,由于节省和耗电低,在活动器具上 HTML5 将具有越来越大的优势。因而更合乎如 Web 操作系统一类的 EnclaveIA 应用的前端开采。

系统简要介绍

本系统依据 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);// 记录被拖拽图标的 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 中的应用程序Logo删除。图 1 来得了桌面拖拽的机能。

图 1. 桌面拖拽效果

云顶娱乐平台注册 10程序张开

次第能够以三种方法张开,左键点击或通过上下文菜单张开。

通过监听 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. 应用程序上下文菜单

云顶娱乐平台注册 11上下文菜单

桌面上下文菜单的贯彻格局与应用程序上下文菜单的落到实处格局为主相仿,图 3 和图 4 分别是桌面以及职责栏的上下文菜单。

图 3. 桌面上下文菜单

云顶娱乐平台注册 12

 图 4. 职务栏上下文菜单

云顶娱乐平台注册 13录像播放器

系统提供了二个大概的摄像播放器,它协理从系统外界拖拽摄像文件举办播放。

适合互联网媒体的开垦进取,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; // 添Gavin书 var reader = new File里德r(); reader.onload = (// 读取文件内容 function(aFileProcessor) { return function(e) { aFileProcessor.src = e.target.result; }; } )(fileProcessor); reader.readAsDataULANDL(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. 录像播放

云顶娱乐平台注册 14

本地存款和储蓄

Web 操作系统平常将第一次全国代表大会61%额存储于服务器端,这样做的好处总之,数据存款和储蓄空间越来越大,安全性越来越好。然则如此做也会有不足之处,由于网络的平稳依旧较本地磁盘差,所以在退出互联网的场地下,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 是不是存在,若荒诞不经,则开创它。第一局地举办一条 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.toLocale提姆eString(); 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. 系统日志

云顶娱乐平台注册 15

记事本

系统提供了贰个差不离的记事本,完成了文本文档的基本操作。文本文书档案包罗标题和内容八个显式属性,以及三个名字为id 的隐式属性。与系统日志类似,本地数据库为文本数据的仓库储存提供了尾巴部分的支撑。图 7 显示了记事本程序的分界面。

图 7. 记事本

云顶娱乐平台注册 16

当编辑完文书档案的标题与内容后,点击左上角的保留开关,将实施 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 方法在桌面上为新文书档案创制贰个文书档案Logo。清单 14 突显了 createFileIcon 方法的有血有肉经过。

清单 14. 开立文书档案Logo

XHTML

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 }

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. 文本文书档案

云顶娱乐平台注册 17时钟

系统提供了贰个简便的钟表用以展现当前岁月,它由贰个表面以及分针和时针组成,能够随着时间的调换动态地变换。现在的 web 应用使用 JavaScript 或 Flash 达成此类作用,其复杂同理可得。借助 HTML5 的 draw API,能够轻松地画出所需的图形,一点都不小的方便人民群众了此类应用的塑造,其它,HTML5 还提供了昔日 JavaScript 不可能支撑的十二线程编制程序,大大抓牢了 web 应用的交互性和丰裕性。

石英表有一个基本的表面,它仅是一副轻便的图样,如图 9 所示。

图 9. 表盘

云顶娱乐平台注册 18

在表面之上,建有二个 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. 时钟

云顶娱乐平台注册 19离线协助

就算如此 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. 离线系统

云顶娱乐平台注册 20结束语

正文介绍了 Web 操作系统的基本知识,并与观念的操作系统举办了相比较,进而介绍了 HTML5 这种新本领为 Web 操作系统开辟拉动的裨益,并与历史观的 web 前端开垦本事拓宽了比较,最后通过营造二个主导的 Web 操作系统详细的表现了 Web 操作系统的基本情势和效果以及扶助其运转的 web 前端开辟本事是何等促成其具体效果的。从本文的座谈中能够看出,基于 HTML5 的 Web 操作系统是前景的一大趋势,必将逐步进入大家的平常生活工作中去。

赞 2 收藏 1 评论

云顶娱乐平台注册 21

邪念

咱俩都看过这种无耻的广告做得跟Windows弹出窗完全一样,它们平时发生二个正值的连串央求:更新Java或近似的。

假定二个恶心网页弹出多个仿真的种类提醒并还要振动,你有多大的信心能分别一个合法的弹出框和二个png图片?毕竟手提式有线电话机振动了,你就能认为它是真正的体系提示。

云顶娱乐平台注册 22

(图1)

那时你是吸取了三个“空中投送”炸弹,依旧说网页在跟你开个小笑话?

页面广告自动播放声音自然就很烦人了。自动振动跟它比起来一点也不逊色。回看一下您在满显示屏寻找那么些推销保证的广告。

近日震荡的强度还不能够说了算,只可以调控持续时间。当然通过组织恶意代码去突破没打补丁的浏览器亦非不容许的,以致足以让电机持续高负荷运维直到损坏。

字体的分类

就 Web 常用的一些字体来讲,经常据他们说的字体类型,大约能够分成这二种:

  • serif(衬线)
  • sans-serif(无衬线)
  • monospace(等宽)
  • fantasy(梦幻)
  • cuisive(草体)

实际大要上分为衬线字体和无衬线字体,等宽字体中也可能有衬线等宽和无衬线等宽字体,这5 个分类是 font-family 的 5 个可用字种类列取值。

云顶娱乐平台注册 23

也正是说,上述 5 个名字,代表的不要某些特定字体,而是一文山会海字体,那个通用的名称允许顾客代理(常常正是浏览器)从相应集结中精选一款字体。

那也很好解释了,font-family 中的 family ,家庭的乐趣,也正是不单单指贰个,而是可以内定多少个,上述 5 个阿拉伯语单词都是 font-family 的可用取值,下文还有恐怕会详细讲到。

下边详细掌握一下每类字体。(本来每二个字体都有贴暗中表示图的,无可奈何微博摆出来太影响雅观,能够移动笔者的Github阅读)

关于笔者:唐尤华

云顶娱乐平台注册 24

做和睦喜好的,编制程序、喝茶、看世界 个人主页 · 笔者的小说 · 18 ·     

云顶娱乐平台注册 25

假冒伪造低劣来电

假设与HTML5 奥迪o一同使用,完全可以创造贰个很实际的假冒伪造低劣”来电“,既有惊动也许有铃声。一旦”接听“,页面就足以播放一段音频:”喂,尽快回打给作者,笔者的编号是“叁个吸费号码”。接下来还可以使用U宝马7系I自动张开拨号分界面。

云顶娱乐平台注册 26

(图2)

您能告诉本人上面说的是实际的来电吗?要是您够细致或者会意识。但假如页面正在播放你的暗中认可铃声,然后设备还在抖动,那时你就很恐怕迷糊。借使和WebRTC呼叫绑定,那实在你看看的正是一个紧凑组织的圈套。

serif — 衬线字体

serif,意为有衬线的书体,衬线的情致是在字符笔画末端有堪当衬线的小细节的额外装饰,並且笔画的粗细会有所分化,那么些细节在大写字母中特地鲜明。

OK,那么有怎么着常用字体属于衬线字体呢?

摄像演示

正文作者还录了一段摄像,放在Youtube上了。

宋体(SimSun)

Windows 下超过半数浏览器的暗许汉语字体,是为适应印刷术而产出的一种汉字字体。笔画有粗细变化,是一种衬线字体,陶文在小字号下的显得效果仍可以接受,可是字号一大要验就比较糟糕了,所以选取的时候要注意,不建议做标题字体选拔。

源代码

上面是几个很基本的事例,你能够在四弟大上考试眨眼之间间。(或点击此处看示例)

JavaScript

<body> <script type="text/javascript"> navigator.vibrate = navigator.vibrate || navigator.webkitVibrate || navigator.mozVibrate || navigator.msVibrate; navigator.vibrate([1000, 500, 1000, 500, 1000, 500, 1000, 500, 1000, 500, 1000, 500, 1000, 500]); </script> <img width="100%" src="phone.png" onclick="window.location.href='tel:09098790815';" /> <audio autoplay="autoplay"> <source src="ring.mp3" /> </audio> </body>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
&lt;body&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
  navigator.vibrate = navigator.vibrate ||
       navigator.webkitVibrate ||
       navigator.mozVibrate ||
       navigator.msVibrate;
 
  navigator.vibrate([1000, 500, 1000, 500, 1000, 500, 1000, 500, 1000, 500, 1000, 500, 1000, 500]);
&lt;/script&gt;
&lt;img width=&quot;100%&quot; src=&quot;phone.png&quot; onclick=&quot;window.location.href=&#039;tel:09098790815&#039;;&quot; /&gt;
&lt;audio autoplay=&quot;autoplay&quot;&gt;  
  &lt;source src=&quot;ring.mp3&quot; /&gt;  
&lt;/audio&gt;
&lt;/body&gt;

当前独有Android平台的Firefox协助,但没有什么可争辨的别的浏览器将会跟进。

Times New Roman

Mac 平台 Safari 下私下认可的英语字体,是最广泛且广为人知的西方文字衬线字体之一,众多网页浏览器和文字管理软件都以用它看作暗中认可字体。

提示:

Firefox是Andriod平台上独一扶助振动的。其余的举个例子说Samsung浏览器,Chrome或许Opera都不协理。Iphone也不帮忙。Windows Phone或Samsung根本没人介意的,所以小编就不测量检验了。

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

你以为浏览器在震憾前是还是不是应当有警告?还是说这种风险太低?作者想那要看那个骗子集团是还是不是会使用这点了,只怕要看客商是还是不是反对了。

更新: 感谢Reddit和HackerNews地方的评论和介绍,BB10就像是也支持振动API,Windows Phone不协理。

赞 收藏 3 评论

sans-serif — 无衬线字体

sans 的情趣是无,sans-serif 也正是无衬线的情趣。专指西方文字中一向不衬线的书体,与汉字字体中的石籀文相对应。与衬线字体相反,该类字体日常是教条主义的和统一线条的,它们往往有着同等的曲率,笔直的线条,锐利的拐角。

华语下,无衬线字体正是甲骨文,石籀文字相当于又称方体或等线体,没有衬线装饰,字形方正,笔画横平竖直,笔迹全体同样粗细。

拜谒又有啥常见的无衬线字体。

本文由云顶集团400800044发布于云顶集团400800044,转载请注明出处:Mobile做HTML5平移应用的五个优劣势【云顶娱乐平台

关键词: