悠悠楠杉
WML学习之六事件
一、WML事件模型概述
在90年代末的移动互联网萌芽期,WML作为专为早期手机设计的标记语言,其事件模型与HTML有着显著差异。记得我第一次在诺基亚7110上测试WML页面时,那种通过物理按键触发事件的交互方式,与现在的触摸屏体验截然不同。
WML采用基于卡片(card)的离散式事件模型,每个事件都绑定在特定卡片元素上。与HTML的全局事件传播不同,WML事件具有以下特点:
- 本地化触发:事件仅在当前卡片有效
- 硬件驱动:主要响应物理按键事件
- 有限类型:仅支持onenterforward等基础事件类型
wml
<card id="main" ontimer="#card2">
<timer value="30"/>
<p>页面将在30秒后跳转</p>
</card>
二、核心事件类型详解
1. 定时器事件(ontimer)
在开发移动天气应用时,我曾用ontimer实现自动刷新功能。这种事件需要配合<timer>
标签使用,其value属性以1/10秒为单位:
wml
<card ontimer="refresh.wml">
<timer value="50"/> <!-- 5秒触发 -->
<p>数据刷新中...</p>
</card>
常见问题:部分老式手机存在定时器精度差异,建议测试时预留20%余量。
2. 选项选择事件(onpick)
这是我处理手机菜单导航的利器。当用户通过方向键选择<option>
项时触发:
wml
<select name="fruit" onpick="#showDetail">
<option value="apple">苹果</option>
<option value="orange" onpick="#specialOffer">橘子(特惠)</option>
</select>
曾有个有趣的案例:某日本运营商手机对onpick事件有300ms的延迟,需要通过WMLScript优化响应速度。
三、事件与WMLScript的联动
在银行WAP站点开发中,我们这样处理表单验证:
wml
<card>
<input type="text" name="account" />
<do type="accept" onclick="validate.wmls#checkAccount()">
<go href="#nextCard"/>
</do>
</card>
对应的WMLScript文件:
javascript
extern function checkAccount() {
var acc = WMLBrowser.getVar("account");
if (acc.length != 16) {
Dialogs.alert("账号应为16位数字");
WMLBrowser.refresh();
}
}
开发经验:
1. 避免在低速网络环境下使用大量脚本
2. 所有外部调用函数必须声明为extern
3. 变量传递需要通过WMLBrowser对象
四、实战中的事件优化技巧
2002年给中国移动做WAP门户时,我们总结出这些优化方案:
事件委托:在父卡片定义通用处理器
wml <template onclick="#back"> <do type="prev" label="返回"/> </template>
硬件适配:
- 摩托罗拉手机需要明确指定<do type="soft1">
- 爱立信设备对长按事件有特殊处理
- 性能平衡:
```wml
```
五、与现代技术的对比思考
虽然WML已被HTML5取代,但它的某些设计理念仍值得借鉴。比如微信小程序的生命周期事件,就与WML的卡片事件模型有异曲同工之妙。在物联网设备开发中,这种轻量级事件模型反而比复杂的DOM事件更适合资源受限的环境。
最近接触的一个智能手表项目,其事件处理方式就让我想起当年用WML开发的日子——同样的受限环境,同样的需要精准控制每个字节的资源消耗。
结语:WML事件机制虽然简单,但在特定场景下仍展现出独特价值。理解这些底层原理,有助于我们在新技术浪潮中保持清醒的设计思维。
```