打印

[编程] FLASH里做新闻信息列表按日期,按标题排序,以及关键字搜索..(不通过后台排)

最近做到一个项目有用到,以前做新闻信息排序跟关键字搜索都是由后台完成,然后生成XML,FLASH再去读,这样由FLASH去LOAD后台程序页面,后台又要去访问数据库,然后排好输出,FLASH等排好了再去读,但是客户要求是苛刻的,他说这样速度上慢很多,要求一定要在FLASH里直接完成,累得我跑来经典请教了各位大虾,最后还是搞定了.大难不死啊
我把我大概的做法贴出来,大家一起交流下,看还有没更好的办法实现
成品浏览:http://www.an-ye.cn/Search
XML地址为:http://www.an-ye.cn/Search/xml/xml_1.xml
首先是日期排序
我的做法是用sortOn来排,因为sortOn可以按数组中的某种属性来排序
所以我们只要给每个数组元素定义它属性 以及把相应数字赋值给它 这样就可以通过sortOn来排出日期大小的信息了
但是单独的日期是不能直接比较大小的(可能有方法可以比,但是我不知道),所以我是用先比较年,然后比较月,最后比较日的方法做的
然后日期最大的,例如上面的数组有5个元素,每个轮流跟其他4个数组元素比较一下,如果最大的是大于其他4个,那么变量dateNum就
dateNum++四次,然后把值赋给这个数组元素DateDataArr[k].Value=dateNum;最后每个数组元素都会得到一个单独的数字
最后我们就可以用DateDataArr.sortOn("Value",2|16);来把这些数组按Value这个元素从大到小或者小到大排列了
具体代码如下,把代码粘贴放到第一帧就输出就可以看到排序效果了:
复制内容到剪贴板
代码:
var DateDataArr:Array=["2008-01-02","2008-05-20","2008-03-13","2008-01-10","2007-01-09"];
for(k=0;k<DateDataArr.length;k++){
    var dateNum=0;            
    for(j=0;j<DateDataArr.length;j++){
        var YearN=Number(DateDataArr[k].split("-")[0]);
        var MonthN=Number(DateDataArr[k].split("-")[1]);
        var dayN=Number(DateDataArr[k].split("-")[2]);
        var YearNN=Number(DateDataArr[j].split("-")[0]);
        var MonthNN=Number(DateDataArr[j].split("-")[1]);
        var dayNN=Number(DateDataArr[j].split("-")[2]);
        if(YearN>YearNN){
            dateNum++;
        }else if(YearN==YearNN){
            if(MonthN>MonthNN){
                dateNum++;
            }else if(MonthN==MonthNN){
                if(dayN>dayNN){
                    dateNum++;
                }
            }
        }
    }
    DateDataArr[k].Value=dateNum;
}
//按日期正排序
DateDataArr.sortOn("Value",2|16);
//按日期逆排序
//DateDataArr.sortOn("ValueN",1|16);
trace(DateDataArr);
[ 本帖最后由 moyu0921 于 2008-4-23 23:59 编辑 ]

TOP

然后是按标题排
按标题比较简单些,直接sort排序就搞定了HOHO
复制内容到剪贴板
代码:
var tiTlelDataArr:Array=["ccc","bbb","zzz","222","111"];
//按标题正排序
tiTlelDataArr.sort();
//按标题倒排序
//tiTlelDataArr.sort(2);
trace(tiTlelDataArr);

TOP

其次是关键字搜索
首先在场景上做一按钮实例名为btn,一个输入文本实例名为SearchTxt
因为FLASH里提供了indexOf搜索函数(这里感谢下flash023斑竹的提示),indexOf是查询数组用,如果有查到有相关的内容数组.indexOf(SearchTxt.text)的值会为0,否则为-1;
所以我们要新建一个新的空数组SearchArr,用来组合所有符合关键字的内容,每搜索到一条符合的内容便push上去,而最后SearchArr这个数组便是我们所搜索出来的东西.
具体代码如下:
复制内容到剪贴板
代码:
var dataArr:Array=["ccc","bbb","zzz","aaa","aa"];
btn.onRelease=function(){
    var SearchArr:Array=new Array();
    if(SearchTxt.text!=""){
        for(j=0;j<dataArr.length;j++){
            if(dataArr[j].indexOf(SearchTxt.text)!=(-1)){
                SearchArr.push(dataArr[j]);
            }
        }
        if(SearchArr.length==0){
            trace("没有相关信息");
        }else{
            trace(SearchArr);
        }
    }
}
[ 本帖最后由 moyu0921 于 2008-4-23 23:52 编辑 ]

TOP

提供源码看看.

TOP

引用:
原帖由 yq7556 于 2008-4-28 13:58 发表
提供源码看看.
自己下载SWF反编译嘛,我又没加密,没看到XML路径都给了啊
毕竟是客户花钱做的东西 直接发出来有点不好 别人自己反编就不同了
XML文件路径可以在页面JS里设置,支持加载多个XML,新闻标题截取长度也是页面JS里设置,还有大小等

[ 本帖最后由 moyu0921 于 2008-4-28 16:47 编辑 ]

TOP

不用反编译,也不提倡!这里有一个类似的flash新闻发布系统,也带这两种排序,也带关键字查询!
源码下载地址:
http://www.52ria.com/html/Source/Utilities/20080505/325.html
中国第一FLASH开源平台www.52ria.com

TOP

楼上的少打广告了,无聊到死,一个SWF就叫源码,你搞笑吧
H3工作室承接网站外包,http://www.lushan.org

TOP

客户的钱已收到,4楼的兄弟要源代码的话,我现在贴上源文件
里面我加了点功能 就是应客户要求的可以加载多个XML文件,跟XML文件中子节点的标识符可以乱序
最右边的是刷新功能,右2的是搜索到关键字信息后,可以撤消关键字信息,恢复到原来的信息排列功能
因为论坛限制了附件的大小 我分两个文件传,解压全部放在同一个文件夹下就可以了


[ 本帖最后由 moyu0921 于 2008-5-20 01:33 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!

TOP

楼主,太感谢你的无私精神了,我们又多了一个学习的机会…谢谢

TOP

谢谢分享

谢了
写得不错
希望

TOP

很棒!支持一下

TOP

感谢楼主
自己水平与您实在相差太远
昨天晚上花了几小时也自制了个新闻系统
是把最早不知道谁的XML的友情连接改成了新闻系统
实在欠佳
附上地址
http://www.lucifinil.com/rizhi/rizhi.swf
拾囬羽翼

TOP

楼主呀,你好强大!!!

我下载了你的原文件!是个好东西呀~~~我想问一下这个是从哪里添加新闻的呢????

TOP

引用:
原帖由 yomans 于 2008-6-10 11:36 发表
我下载了你的原文件!是个好东西呀~~~我想问一下这个是从哪里添加新闻的呢????
从XML里添加啊 XML数据可以由后台生成,asp asp.net php等服务器端语言都可以做到啊
因为这里是FLASH8的版块,所以给出的只是前台的FLASH显示部分,后台添加数据部分还是要自己动手的 呵呵

TOP

客户不知道AS的效率是出了名的低么?
承诺就像操你妈,说的人太多了,做到的没几个

TOP

引用:
原帖由 蓝色月光 于 2008-6-10 16:45 发表
客户不知道AS的效率是出了名的低么?
他知道我就没银子赚了

TOP

对于日期排序,楼主的做法思路很独特,但有点复杂,我想,按最原始的日期排序方法来思考,他就是通过比较一个或多个属性来排序,数组的基本格式是year:2008,month:05,day:05,而从XML读出来(2008—05—02)没有这个属性名(即2008前没有year),那我们的工作就是来构造这么一个数组(格式为 “ 属性名1:值1,属性名2:值2”),直接排列就行了,现在帖出源码:

var myarray:Array=new Array()//不要写在FOR循环内,否则每次都会声明
var DateDataArr:Array=["2008-01-02","2008-05-20","2008-03-13","2008-01-10","2007-01-09"];
//trace(DateDataArr)
for(i=0;i<DateDataArr.length;i++){
var newDateDataArr:Array=DateDataArr[i].split("-")
year=newDateDataArr[0]
month=newDateDataArr[1]
day=newDateDataArr[2]
myarray.push({year:year, month:month, day:day});
}//构造myarray新数组
myarray.sortOn(["year","month","day"],1|16)//重新排列
for(i=0;i<DateDataArr.length;i++){
trace(myarray[i].year+","+myarray[i].month+","+myarray[i].day)
}//这一句不能写在上一个FOR循环当中

TOP