使用dojo离线功能3-其它问题

5.1. 网页资源的手工缓存

尽管利用 slurp() 方法可以为我们完成很多自动化的工作,但一些出现在 JavaScript 中的动态加载的资源是 slurp() 所无法分析得到的。因此,在实际应用中作为补充,我们往往还需要将一些 slurp 过程中的 漏网之鱼 手工加入本地缓存中。而 Dojo Offline 也为我们提供了相应的功能以支持这一需求。

手工将网络资源加入本地缓存的方法十分简单,例如,假设我们要将一个名为 big_and_little_fish.jpg 的文件缓存起来,可以执行如下方法:

dojox.off.files.cache("images/big_and_little_fish.jpg");

不仅如此, Dojo Offline 还提供了一次性指定多个文件的功能,调用方法如下所示:

dojox.off.files.cache([

                  "images/fish1.png",

                  "images/fish2.png",

                  "scripts/some_dynamic_fish.js"

                  ]);

我们可以多次调用 cache() 方法,假如调用过程中指定了多个同名文件,则最后一次被缓存的文件将会替换前面的同名文件。利用这一方法,再结合前述的 slurp() 方法,我们就可以很好的将离线所需的全部资源在本地缓存起来了。

5.2. 数据的加密与解密

将数据下载到本地进行缓存是离线功能得以实现的重要步骤,但是假如这些数据中包含有敏感信息,例如身份证号码,而本地环境又不甚安全时,则对数据进行加密处理是很有必要的。前面曾经提到,我们在利用 Dojo Offline 进行数据存储时可以选择使用 Dojo SQL 。而 Dojo SQL 允许我们很方便的对数据的某些字段进行加密和解密。

假设我们有一张名为 CUSTOMER 的表,其中包含了三个字段,分别是: “last_name” “first_name” “social_security” 。其中最后一个字段属于敏感信息。

Dojo SQL 提供了两个特殊的关键字, ENCRYPT() DECRYPT() ,分别用以实现加密和解密操作。以 social_security 为例,调用方式类似如下:

var password = "password";

dojox.sql("INSERT INTO CUSTOMERS VALUES (?, ?, ENCRYPT(?))", "Neuberg", "Brad", "111111111",password,

function(results, error, errorMsg){

if(error){ alert(errorMsg); return; }

});

在上述代码中,我们在最后一个字段加上了 ENCRYPT 关键字,声明对其进行加密。除此以外,我们还提供了一个 password 参数,这是底层加密机制所必须的。当我们启用应用系统时,系统会提示输入这一密码。出于对本地数据安全性的考虑,请不要将其存于 Cookie Dojo Storage ,或是 Dojo SQL 中,否则他人就可以轻易利用这一密码解开存于本地的敏感数据。另外,上述代码里还定义了一个回调函数。该回调函数将会在加密过程结束之后被调用。如果加密成功, results 对象中将会包含经过加密后的数据;如果加密失败,则 error 值将会为 true ,并且 errorMsg 中会包含对错误原因的描述信息。

和加密一样,对数据进行解密的过程也十分简单。我们只需对需要解密的字段调用 DECRYPT 关键字即可。示例代码如下:

var password = "password";

dojox.sql("SELECT last_name, first_name, DECRYPT(social_security) FROM CUSTOMERS",

password,

function(results, error, errorMsg){

if(error){ alert(errorMsg); return; }

// go through decrypted results

alert("First customer's info: " 

+ results[0].first_name + " "

+ results[0].last_name ", " 

+ results[0].social_security);

});

在上述代码中,我们利用 alert 语句将加密后的第一条结果数据打印了出来。其中的 password 必须与加密时所使用的完全一致,否则解密将会失败,结果数据将仍然是加密后的样子。

假如我们要对多个字段进行加密, Dojo SQL ENCRYPT 还有一种很方便的书写方法,即: ENCRYPT(?, ?, ?) ;同样的,对于 DECRYPT 也存在类似的书写方式,已完成一次性对多个数据字段进行解密: DECRYPT(first_name, last_name, social_security)

5.3. 定制 Offline Widget

虽然利用 Dojo Offline Widget 可以省去我们很多的功夫,但是在某些情况下,其默认行为并不一定能够很好的满足我们的需要,例如:默认的样式风格与我们的应用程序不一致,此时,我们就可以对 Offline Widget 进行一定程度的定制。

事实上,我们在页面上所见到的 Offline Widget 有其对应的模板文件,该文件位于 dojox/off/resources/offline-widget.html ,其中包含有一系列的 HTML 元素,这些元素都有相应的 ID ,比如: dot-widget-network-indicator Offline Widget 就是利用默认的 CSS 文件对其进行控制的,该 CSS 文件位于: dojox/off/resources/offline-widget.css 。我们可以通过自定义 CSS 的方式来改变 HTML 元素的样式,从而改变 Offline Widget 在页面中的默认展现风格。

除了改变展现风格,有时我们可能还需要改变展现的内容,我们可以将 offline-widget.html 中的内容选择性的复制到我们自己的 HTML 页面中,这样我们就可以根据自己的需要随意设计 Offline Widget 的展现内容,而无需定义一个 ID dot-widget 的特定 DIV 了。

此外,如果我们只是想修改 Offline Widget 所使用的默认图标的话,则还有更为简单的做法。那就是对如下几个 JavaScript 变量进行修改:

   * dojox.off.ui.onlineImagePath :表示在线状态的图标

   * dojox.off.ui.offlineImagePath :表示离线状态的图标

   * dojox.off.ui.rollerImagePath :表示同步正在进行的图标

   * dojox.off.ui.checkmarkImagePath :表示同步结束的图标

例如,如果我们想将表示在线状态的绿色小圆球状图标替换为自己设计的图标,则可以修改如下:

dojox.off.ui.onlineImagePath = "images/myonlineball.png";

最后,假如我们对默认的 “Learn How” 页面不甚满意的话,则还可以对 dojox/off/resources/learnhow.html 进行修改,其对应的 CSS 样式也定义与 dojox/off/resources/offline-widget.css 中。

5.4. 性能问题

Dojo Offline 每次在对数据进行同步时,始终都会刷新缓存于本地的资源,这一点有可能会对同步的性能构成较大的影响,因为毕竟并非每一次同步都需要刷新所以的本地数据。为了提高同步的效率, Dojo Offline 提供了一种可选的方案,即由应用程序提供一个名为 version.js 的特殊文件,并将其置于应用程序的主路径下。假如该文件存在的话,则同步期间 Dojo Offline 会去读取该文件的内容,并判断其内容是否改变,以此来选择性的刷新本地缓存文件。

我们在 version.js 文件中所提供的内容其实非常简单,可以是一个字符串,也可以是一个数字,形式不限。例如: "03-15-2009.9" 。只要能够让 Dojo Offline 判断出内容的变化即可。

除了同步时候的性能问题外,另一个可能会遇到的性能问题是数据的存储。当我们使用 Dojo SQL 来存储数据时,必须先将底层所依赖的 Google Gears 存储数据库打开,而后才能进行数据的存储,而当数据存储完毕之后,还需将数据库关闭。通常情况下,我们并不需要关心这一点,因为 Dojo SQL 会自动为我们完成这一切,每次当我们执行一句 SQL 语句时,底层代码都会自动处理数据库的打开和关闭。

不过,假如我们是在批量的向本地缓存插入数据的话,比如在一个循环次数为上百次的 for 循环中执行数据插入操作,那么每执行一次 SQL 语句都要打开和关闭一次数据库或许是一种很低效做法。为了提高效率,我们可以在批量操作数据之前通过调用 dojox.sql.open() 手工将数据库打开,而后再通过调用 dojox.sql.close() 手工将其关闭。插入数据期间, Dojo SQL 会自动判断数据库的连接状态,并保持连接一直处于打开状态,直至手工关闭为止:

var dataSet = getDataSet(); // get an array that has a bunch of data in it

dojox.sql.open();

for(var i = 0; i < dataSet.length; i++){

   dojox.sql("INSERT INTO MYTABLE (LAST_NAME, FIRST_NAME) VALUES (?, ?)", dataSet[i].lastName, dataSet[i].firstName);

}

dojox.sql.close();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值