WML中的ontimer事件有着很重要的意义。在实现自动刷新和动画方面很有用处。下面就要讲述如何使用ontimer事件来实现一个自动刷新的时钟程序。
    在实现自动刷新的过程中一个十分重要的问题就是Cache。Cache在WAP中有很重要的作用,但是同时它也给程序编制人员带来了很多不方便。例如:当我反复地查询同一支股票信息的时候,如果不采取防止Cache的方法,那么结果只能是一个。这显然是不正确的。那么如何防止这种情况发生呢?在WAP问答中有详细的解答。但是这里将采用一种最简单的办法,那就是使得用户所产生的URL请求没有一次是相同的。即使出现相同,那么手机的内存无法保留那么多的页面内容。
    时钟的例子程序如下:(需要注意到WML页面和动态生成程序)

Main.wml

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main" ontimer="http://127.0.0.1/wap/wapd.dll?GetTime?ID=100" title="Main">
    <timer name="wait1" value="60"/>
    <p>
        Wait for a moment...
    </p>
</card>
</wml>

    动态时钟程序的核心:

void CWAPExtension::GetTime(CHttpServerContext* pCtxt,int nID)
{
    AddHeader(pCtxt,"Content-type: text/vnd.wap.wml\n\n");

    *pCtxt<<_T("<?xml version=\"1.0\"?>\n");
    *pCtxt<<_T("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN");
    *pCtxt<<_T("\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n");
    *pCtxt<<_T("<wml>\n");

    CString strCard;
    strCard.Format(_T("<card id=\"time\" ontimer=\"http://127.0.0.1/wap/wapd.dll?GetTime?ID=%d\" title=\"Time\">\n"),++nID);
    *pCtxt<<(LPCTSTR)strCard;

    CString strWait;
    strWait.Format(_T("<timer name=\"wait%d\" value=\"60\"/>"),nID);
    *pCtxt<<(LPCTSTR)strWait;

    *pCtxt<<_T(" <p>\n");

    CTime tmCurrent=CTime::GetCurrentTime();
    *pCtxt<<(LPCTSTR)tmCurrent.Format(_T("%Y-%m-%d\n"));
    *pCtxt<<(LPCTSTR)tmCurrent.Format(_T("%H:%m:%S\n"));

    *pCtxt<<_T(" </p>\n");
    *pCtxt<<_T(" </card>\n");
    *pCtxt<<_T("</wml>");
}

    我们注意到nID在不断增加,那么就意味着nID就不可能相同。那么每次的URL就不会相同,手机每次必须去服务器取回内容。大家同时也注意到了ontimer的name怎么也在不断地改变呢?这个是一个很有意思的事情:在UpPhone和Nokia WAP Toolkit 1.2中,如果不改变这个ID,那么就只出现一次刷新,这是为什么呢?很简单,他们将timer这个变量做为全局变量保存了下来,再下一次进来的时候,忘记将timer的value重新赋值了。但是这也不是一个最好的解决办法。你会发现UpPhone在运行128次后就死掉了。为什么?因为每次不同,它都作为全局的timer,因此最多只能有128个timer。怎么办呢?最好的程序在下面:

void CWAPExtension::GetNext(CHttpServerContext* pCtxt,int nID)
{
    nID=nID%67+1;

    AddHeader(pCtxt,"Content-type: text/vnd.wap.wml\n\n");

    *pCtxt<<_T("<?xml version=\"1.0\"?>\n");
    *pCtxt<<_T("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN");
    *pCtxt<<_T("\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n");
    *pCtxt<<_T("<wml>\n");
    *pCtxt<<_T("<card id=\"humor\" title=\"Picture\">\n");
    *pCtxt<<_T(" <onevent type=\"ontimer\">\n");
    CString strGoTo;
    strGoTo.Format(_T(" <go href=\"http://127.0.0.1/wap/wap.dll?GetNext?ID=%d\">\n"),nID);
    *pCtxt<<(LPCTSTR)strGoTo;
    *pCtxt<<_T(" <setvar name=\"wait\" value=\"150\"/>\n");
    *pCtxt<<_T(" </go>\n");
    *pCtxt<<_T(" </onevent>");
    *pCtxt<<_T(" <timer name=\"wait\" value=\"150\"/>");
    *pCtxt<<_T(" <p>\n");
    CString strImage;
    strImage.Format(_T(" <img alt=\"wbmp%d\" src=\"http://127.0.0.1/wap/%d.wbmp\"/>\n"),nID,nID);
    *pCtxt<<(LPCTSTR)strImage;
    *pCtxt<<_T(" </p>\n");
    *pCtxt<<_T(" </card>\n");
    *pCtxt<<_T("</wml>");
}

    这个程序相比之下就好多了。但是在UpPhone上运行还是有问题。已经有同志使用这种方法实现了WAP电子地图的自动更新。