WAP(wml)开发问答
2005-9-16 19:32:00 编辑:阿志 来源:来源网络
| 28. 如何防止变量被保存在Cache中? 变量保存在Cache中,这样变量还可以再利用。例如当用户返回到上一个输入卡片,他不需要重新输入,只需要改变需要改变的地方。但是在某些情况下这会造成一些问题。例如以WAP聊天系统,有些变量用了一遍又一遍,但是需要不同的内容。有些浏览器,例如:Nokia 7110,就会存在类似的在该清除的时候无法清除的问题。 在WML中,<card>标签有一个参数叫做newcontext。 当newcontext="true" 时清除所有的变量。但是这样也清除了所有导航的历史记录,这意味着back按钮不再工作。 为了清除变量,可以告诉浏览器将变量设为空:
<setvar name="one_variable" value=""/> <setvar name="another_variable" value=""/> | 但是,不是每个时候都有效果。在某些情况下必须使用一个难以想象的方法来清空变量。就是使用 onenterforward 事件。
<onevent type="onenterforward"> <refresh> <setvar name="one_variable" value=""/> <setvar name="another_variable" value=""/> </refresh> </onevent> | 29. 怎么能够知道请求是从WML浏览器来的还是HTML浏览器来的? 既然要利用已经存在的为HTML浏览器编写的代码,就需要知道请求是从HTML浏览器还是从WML浏览器过来的。同样地,如果想重新引导的HTML浏览器直接到相应的HTML文档上,WML浏览器到WML页面上,以下的PHP代码就可以做到这些。
<? // Because this script sends out HTTP header information, // the first characters in the file must be the <? PHP tag. // relative URL to your HTML file $htmlredirect = "/html/my_htmlpage.html"; // ABSOLUTE URL to your WML file $wmlredirect = "http://wap.mysite.com/wml/my_wmldeck.wml"; if(strpos(strtoupper($HTTP_ACCEPT),"VND.WAP.WML") > 0) {// Check whether the browser/gateway says it accepts WML. $br = "WML"; } else { $browser=substr(trim($HTTP_USER_AGENT),0,4); if($browser=="Noki" || // Nokia phones and emulators $browser=="Eric" || // Ericsson WAP phones and emulators $browser=="WapI" || // Ericsson WapIDE 2.0 $browser=="MC21" || // Ericsson MC218 $browser=="AUR " || // Ericsson R320 $browser=="R380" || // Ericsson R380 $browser=="UP.B" || // UP.Browser $browser=="WinW" || // WinWAP browser $browser=="UPG1" || // UP.SDK 4.0 $browser=="upsi" || // another kind of UP.Browser ?? $browser=="QWAP" || // unknown QWAPPER browser $browser=="Jigs" || // unknown JigSaw browser $browser=="Java" || // unknown Java based browser $browser=="Alca" || // unknown Alcatel-BE3 browser (UP based?) $browser=="MITS" || // unknown Mitsubishi browser $browser=="MOT-" || // unknown browser (UP based?) $browser=="My S" || // unknown Ericsson devkit browser ? $browser=="WAPJ" || // Virtual WAPJAG www.wapjag.de $browser=="fetc" || // fetchpage.cgi Perl script from www.wapcab.de $browser=="ALAV" || // yet another unknown UP based browser ? $browser=="Wapa") // another unknown browser (Web based "Wapalyzer"?) { $br = "WML"; } else { $br = "HTML"; } } if($br == "WML") { // Force the browser to load the WML file instead header("302 Moved Temporarily"); header("Location: ".$wmlredirect); exit; } else { // Force the browser to load the HTML file instead header("302 Moved Temporarily"); header("Location: ".$htmlredirect); exit; } ?> | 这个判断是在服务端完成的, PHP代码将首先查看网关是否接收text/vnd.wap.vml MIME类型。如果不是,将检测前面的字符,查看是否为WML浏览器。如果不符合,那么就假设为HTML浏览器。如果有新的WML浏览器,那么ID字符串也要增加。 这个代码基于Robert Whitinger(robert@wapsight.com)的代码,使用了Don Amaro(donamaro.concepcion@nl.unisys.com)提供的列表。 注意:由于只需要四个字符串就可以辨别,因此例如:"WapIDE-SDK/2.0;(R320s(Arial))" 可以使用“WapI”来代替是可行的做法,也是足够的。 同样的功能也可以通过ASP来解决。先判断请求的是“/index.wml” 或者 “/index.html” 和所需要的MIME类型。另外以下的脚本辨别的方式和上面不一样。另外还需要网关告诉服务器它能接收 的text/vnd.wap.wml MIME类型。该例子如下所示:
<% Response.Buffer = TRUE Dim IsWap httpAccept = LCase(Request.ServerVariables("HTTP_ACCEPT")) if Instr(httpAccept,"wap") then IsWap=1 Else Response.Redirect "/index.html" : Response.Flush : Response.End End if %> <%Response.ContentType = "text/vnd.wap.wml"%><?xml version="1.0"?> <%Response.Flush%> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card id="redirect"> <onevent type="onenterforward"> <go href="/index.wml"/> </onevent> <p> <a href="/index.wml">enter</a> </p> </card> </wml> <%Response.Flush:Response.End%> |
30. 如何判断访问者是来自哪个浏览器或者移动电话? 可以通过检查HTTP_USER_AGENT标签来判断。例如试着使用Microsoft Internet Explorer访问一个站点的时候,HTTP_USER_AGENT将返回:Mozilla/4.0 (compatible;MSIE 5.0; Windows 98);在同样的情况下使用Nokia 7110访问这个站点,HTTP_USER_AGENT就会是:Nokia7110/1.0(04.73)。据此可以判断用户代理是什么类型的。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] 下一页
|