静态的动态续篇之来点XML


Posted in Javascript onAugust 15, 2006

在搞定了基本的伪动态之后,我马上把它应用到了网站,但随后就发现了一个问题:我如何来管理新闻列表呢?要是让我在每次要加新闻时去修改源文件然后再上传我可是千万个不愿,不仅麻烦而且容易出错,懒人怎么能可以这么做。动动脑子,于是想到了用XML,这个早已存在,但近些年才流行起来的技术。

在HTML里,可以使用数据岛来使用XML数据,一个使用方法就是在HTML里加入一句:

<xml id="data">

    <!-- 在此为XML数据 -->

</xml>

这样,就可以在HTML里使用XML提供的数据。不过,这样还是显得麻烦了,还是要上传整个文件,那么用方便点的吧~~

<xml id="data" src="data.xml"/>

这样处理之后,我就可以只用修改一个XML文件然后上传到服务器了。

接下来,就是搞定在客户端对XML数据的处理了~~

首先,我得设计一个新闻的数据结构。这个简单,毕竟在列表时只需要用到新闻的标题和时间,但为了链接,需要加上一个ID,结果如下:

<newslist>

    <news>

        <id>1</id>

        <title>第一个新闻</title>

        <date>2005-11-16</date>

    </news>

</newslist>

数据结构搞定了,继续!

在客户端对数据处理当然首选JavaScript了,再么这篇文章讲的也是用JavaScript来实现伪动态。

在JS里,对数据岛的访问可以使用记录集:

var rs=data.recordset;

这个记录集的使用方法和ASP中类似,这下方便我了:),可以很方便地实现新闻的列表及链接了~在显示新闻,还需要显示的是上一条新闻的标题及下一条新闻的标题,而且显示新闻列表时,就不需要显示上一条及下一条新闻了。于是我放了两个层分别用来显示新闻和上一条及下一条新闻的信息,并在需要的时候设置是否显示。其中newsmain用来显示新闻或者新闻列表,newspage用来显示上一条及下一条新闻的信息。接着把对应ID的新闻存为网页文件,在显示时使用iframe嵌入。

先写个函数来从网址中获取新闻ID,这个在前一篇文章已经讲过,拿来用~~

function getid() {

    var str,len,pos,id,fn;     // 定义一些变量

    str=top.window.location.href;    //获取当然文件地址

    len=str.length;     // 得到地址长度

    pos=str.indexOf("?id=",0);   // 得到"?id="的起始地址

    // 判断是否存在"?id="

    if(pos>0) {

        id=str.substring(pos+4,len);   // 获取ID

        return eval(id);  // 返回数值类型的ID,方便处理

    }

    else {

        return 0;  // 错误参数,返回0,显示新闻列表

    }

}

再来个函数处理进入页面时执行什么动作,是显示新闻列表还是显示相应ID的新闻

function showmain() {

    var id;

    id=getid();  // 获取新闻ID

    // 是 0 则显示列表

    if(id>0) {

        rs.absoluteposition=id;  // 设置游标到指定的新闻

        shownews(id); // 显示新闻

    }

    else {

        showlist();   // 显示新闻列表

    }

}

显示新闻列表的函数

function showlist() {

    var ss="";  // HTML

    var i;  // 循环计数器

    rs.movefirst();  // 移动到第一个记录

    // 循环读取新闻记录

    for(i=0;i<rs.recordcount;i++) {

        ss=ss+"<font color=#800000>·</font><a href='javascript:shownews("+rs("id")+")'>"+rs("title")+"</a> ("+rs("date")+")<br/>";  // 添加一个新闻

        rs.movenext();  //移动到下一条一新闻

    }

    document.all.newsmain.innerHTML=ss;  //在新闻显示区输出新闻

    document.all.newspage.style.visibility="hidden";  // 显示新闻列表时,不显示前后新闻的信息

}

显示指定的新闻,并显示前后新闻的信息

function shownews(id) {

    var ps;  // 用于存放前后新闻的信息

    document.all.newsmain.innerHTML="<iframe class='news_main' frameborder='0' src='news/"+id+".htm'/>";  // 用iframe来显示新闻

    document.all.newspage.style.visibility="visible";  // 使前后新闻信息可见

    rs.absoluteposition=id;  // 将记录游标移动到当前新闻

    // 如果ID小于1说明是第一条记录,上一篇新闻就是“没有了”:)

    if(id<=1) {

        ps="上一篇:没有了";

    }

    // 否则就显示上一篇新闻的标题

    else {

        rs.moveprevious();  // 记录游标向前移动

        ps="<a href='javascript:shownews("+(id-1)+")'>上一篇:"+rs("title")+"</a>";  // 显示前篇新闻信息

        rs.movenext();  // 恢复记录游标

    }

    ps=ps+" ";  // 在两个信息之间插入一个空格

    // 如果ID大于记录总数说明这是最后一个新闻了~

    if(id>=rs.recordcount) {

        ps=ps+"下一篇:没有了";

    }

    // 否则显示下篇新闻的标题

    else {

        rs.movenext();  // 记录游标向前移动

        ps=ps+"<a href='javascript:shownews("+(id+1)+")'>下一篇:"+rs("title")+"</a>";  // 显示下篇新闻的标题

        rs.moveprevious();  // 恢复记录游标

    }

    document.all.newspage.innerHTML=ps;  // 显示前后新闻标题~

}

好了,到底算是基本完工了~具体使用可以这样来:

在head区加入XML数据岛

<head><xml id="data" src="newslist.xml"/></head>

接着在body的onload事件里执行showmain()

<body onload="showmain()">

还需要在body里加入两个层用于显示信息

<div id="newspage"></div>

<div id="newsmain"></div>

完工!

不过,我所用的方法也有不完善的地方,如新闻列表的ID必须保证顺序排列且不能有缺漏,因为在使用记录集时用到了绝对定位,还有其他等等。我写文章比较烂,所以:欢迎指正批评^-^!也欢迎大家我交流经验心得等,我的mail是vipxjw@tom.com。

Javascript 相关文章推荐
Ext对基本类型的扩展 ext,extjs,format
Dec 25 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
Dec 08 Javascript
jQuery源码解读之hasClass()方法分析
Feb 20 Javascript
JS在onclientclick里如何控制onclick的执行
May 30 Javascript
详解AngularJs中$resource和restfu服务端数据交互
Sep 21 Javascript
微信小程序 网络请求(post请求,get请求)
Jan 17 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
addEventListener()与removeEventListener()解析
Apr 20 Javascript
mongoose中利用populate处理嵌套的方法
May 26 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
js判断文件类型大小并给出提示的实现方法
Jan 03 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
Jun 11 Javascript
实用javaScript技术-屏蔽类
Aug 15 #Javascript
巧妙破除网页右键禁用的十大绝招
Aug 12 #Javascript
总结一些js自定义的函数
Aug 05 #Javascript
document对象execCommand的command参数介绍
Aug 01 #Javascript
[JS]点出统计器
Oct 11 #Javascript
破解Session cookie的方法
Jul 28 #Javascript
自适应图片大小的弹出窗口
Jul 27 #Javascript
You might like
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
小程序中的箭头函数的具体使用
2020/06/19 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
python中requests使用代理proxies方法介绍
2017/10/25 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
django用户登录验证的完整示例代码
2019/07/21 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
科技节口号
2014/06/19 职场文书
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫