金牌榜 - html分析/xml分页应用一例
- 作者:L4cd 来源:L4cd.Net 文章点击数:
最近奥运期间,除了支持中国队以外,今天制作了"金牌榜"一例。主要应用到下面的常用技巧:
html源码读取
html+正则获取数据
文本转xml
xml动态创建列表
从xml获取我们想得到的数据
xml分页
巧用htmlText做简单的页码
//Copyright © 2008. Http://L4cd.Net All Rights Reserved.
package
{
import flash.events.*;
import flash.net.*;
import flash.display.*;
import flash.system.*;
import flash.utils.*;
import flash.text.*;
/**
* 通过分析http://2008.qq.com/medals/中的html代码,获取当前最新的金牌榜
*
* @author L4cd.Net
* @version 2008-8-11 20:46
*/
public class olympic extends Sprite
{
//定义数据源,这里以QQ为例
private const server:String = "http://2008.qq.com/medals/"
//定义页码/单页记录数/总页数
private var page:uint;
private const pagesize:uint = 10;
private var pageCount:uint
//定义list的偏移
private var _x:uint = 2;
private var _y:uint = 29;
//用于保存数据与列表
private var data:XMLList;
private var list:Array;
public function olympic()
{
//不多说了
stage.scaleMode = "noScale";
stage.showDefaultContextMenu = false
init()
}
private function init():void
{
//开始读取数据
dataRefurbish()
//侦听页码点击
txt_pager.addEventListener(TextEvent.LINK, link)
}
private function textShow(txt:String):void
{
txt_pager.htmlText = txt
}
private function dataRefurbish():void
{
textShow("开始读取.")
var loader:URLLoader = new URLLoader()
loader.addEventListener(Event.COMPLETE, dataComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, dataError);
loader.load(new URLRequest(server))
}
private function dataError(e:IOErrorEvent):void
{
textShow("读取出错!")
}
private function dataComplete(e:Event):void
{
//删除之前创建的列表
listDelete()
//分析html文本
var html:String = e.target.data.replace(/<img(.*?)>/gis,"<img$1/>")
var reg:RegExp = new RegExp("<div class=\"fl col708\" id=\"col708\">(.*?)</div>", "gis")
var rs:Object = reg.exec(html)
//保存html文本到XML对象
data = new XMLList()
try
{
data = (new XML(rs["0"])..tr);
}catch(e:Error){}
if (data.length() < 2)
{
textShow("分析数据出错!")
return;
}
//删除第一条数据,这里是列表的标题
delete data[0]
//初始化分页数据
page = 0
pageCount = Math.ceil(data.length() / pagesize);
trace("总记录", data.length())
trace("总页数", pagesize)
//显示列表(第一页)
dataShow(page)
}
private function dataShow(num:uint):void
{
//删除之前创建的列表
listDelete()
//保存page
page = num
list = []
//动态创建列表
for (var i:uint = page * pagesize; i < page * pagesize + 10; i++ )
{
var item:XML = data[i]
var mc:MovieClip = new k_list()
mc.txt_sort.text = String(i + 1);//排名
mc.txt_name.text = toUTF8String(item..a);//国家名
mc.txt_j.text = item.td[2];//金
mc.txt_y.text = item.td[3];//银
mc.txt_t.text = item.td[4];//铜
//调整位置
mc.x = _x;
mc.y = _y + (i % pagesize) * 25;
var flag:Loader = new Loader();//国旗
flag.load(new URLRequest(item..img.@src))
flag.x = 25
flag.y = 8
mc.addChild(flag)
mc.flag = flag
addChild(mc)
list.push(mc)
}
//更新页码
pageShow()
}
//删除动态创建的列表
private function listDelete():void
{
if (!list) return;
while (list.length>0)
{
var mc:MovieClip = list.pop()
try{mc.flag.unload()}catch(e:Error){}
delete mc.flag
removeChild(mc)
mc = null
}
list = null
}
//更新页码
private function pageShow():void
{
txt_pager.htmlText = "page:"
for (var i:uint = 0; i < pageCount; i++ )
{
if (i == page)
{
txt_pager.htmlText += " <u>" + (i + 1) + "</u>";
}else
{
txt_pager.htmlText += " <a href=’event:" + i + "’>" + (i + 1) + "</a>";
}
}
}
//点击页码的连接.跳转分页
private function link(e:TextEvent):void
{
dataShow(uint(e.text))
}
//国家名字乱码处理
private function toUTF8String(str:String):String {
var _byArr:ByteArray = new ByteArray();
_byArr.writeUTFBytes(str);
var tpArr:ByteArray = new ByteArray();
for (var i:uint = 0; i<_byArr.length; i++) {
if (_byArr[i] == 194) {
tpArr.writeByte(_byArr[i+1]);
i++;
} else if (_byArr[i] == 195) {
tpArr.writeByte(_byArr[i+1] + 64);
i++;
} else {
tpArr.writeByte(_byArr[i]);
}
}
tpArr.position = 0;
return tpArr.readMultiByte(tpArr.bytesAvailable,"chinese");
}
}
}

- 上一篇:AS3.0 对于粘贴板的控制方法
- 下一篇:Flash教程:你知道这些常用命令吗?
- 相关文章
| ·Flash教程:你知道这些常用命令吗? | 08-16 |
| ·在WEB标准中嵌入Flash 的最佳方法 | 08-15 |
| ·AS3.0 对于粘贴板的控制方法 | 08-14 |
| ·重做MP3播放器的一个心得 | 08-14 |
| ·怎样随机显示文字 | 08-13 |
| ·FLASH鼠绘:小洋楼 | 08-12 |
| ·循环动画的制作 | 08-11 |
| ·写给想做flv播放器的朋友 | 08-02 |
