首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统-> 注册表教程
用 phprpc 实现 ajax 级联下拉菜单_ajax教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

级联下拉菜单就是从一个下拉菜单中选中一项后,相应的另一个下拉菜单的内容会随之改变。

一般来说,最简单的,就是每次选中都提交一次表单,刷新整个页面。这也是用户体验度最差的。

另一种是把所有选项在第一次加载时就全部载入整个页面中的 JavaScript 数组中,然后级联通过 JavaScript 来控制,在整个数据量不大时,这是一个不错的实现无刷新并且快速的方法,但是当整个数据量非常大时,这种方法就会使第一次加载变得非常慢了。

还有就是采用 Ajax 方式,即开始只载入第一层菜单的内容,当用户选中第一层菜单的某项时,再通过 XmlHttpRequest 来获取相应选项所对应的第二层菜单的内容。这种方式效果最好,但是采用传统方式来编写这样的 Ajax 程序代码量会比较多。而且如果设计不好,服务器端返回菜单内容的程序的可复用性也会很差。

但是在本文中你会看到用 PHPRPC 来实现这种 Ajax 效果是多么的简单,并且还会具有非常高的可复用性。


本文以省市两级级联下拉菜单为例,为了举例方便,本文中采用的是 SQLite 数据库,因为这个文件型数据库比较容易部署,而且查询效率很高(当然创建该数据库的效率不高,但创建仅一次而已,该数据库在该程序中内容是不变的),不过服务器需要安装 SQLite 扩展。

这个数据库中的表只有 2 个,一个 province 表,一个 city 表。province 表中,只有 id 和 name 两个字段,分别是省份编号(主键)和省名。city 表中,有 id、name 和 pid 三个字段,id 是城市编号,name 是城市名,pid 是城市所在省的编号,与 province 表中的省份编号相对应。

创建该数据库的程序这里就不给出来了,它包含在后面提供的实例下载中。

下面来看看创建这个程序的服务器端有多么简单,为了提高可复用性,我们把服务器端分为了 2 个文件,一个是 function.php,另一个是 rpc.php。function.php 中定义了实际的远程调用函数,但是他们也可以作为服务器端的本地函数调用,你会发现他们跟服务器端的普通函数没有任何区别:

下载: function.php
<?php
$sqlite = new SQLiteDatabase(area.db);
 
function get_province() {
    global $sqlite;
    $sql = "select * from province order by id";
    return $sqlite->arrayQuery($sql, SQLITE_ASSOC);
}
 
function get_city($pid) {
    global $sqlite;
    $pid = sqlite_escape_string($pid);
    $sql = "select * from city where pid = $pid order by id";
    return $sqlite->arrayQuery($sql, SQLITE_ASSOC);
}
?>
而 rpc.php 更加简单,它是提供给客户端调用的接口,它只有 3 行语句:

下载: function.php
<?php
require_once(function.php);
require_once(phprpc_server.php);
new phprpc_server(array(get_province, get_city));
?>
其中最后一句,就是指定哪些函数要暴露给客户端。只有指定的函数客户端才可以调用,这样可以保证服务器的安全性。

服务器端到此就创建完了。你会发现服务器端只负责把数据查询出来返回给客户端就完事了,其它的不做任何处理。

那么下面该看一看客户端了,客户端虽然很简单,但是我还是把它分成了两个文件,一个 js 文件,一个 html 文件,你会发现用 PHPRPC,客户端都不需要用 PHP。

下载: area.js
// 创建 phprpc 客户端对象 rpc
phprpc_client.create(rpc);
 
var city = []; // 用于缓存已加载的城市数据
 
/*
 * 清除 select 中的选项,该方法可复用
 *
 * so: 要清除选项的 select 对象
 *
 */
function clear_select(so) {
    for (var i = so.options.length - 1; i > -1; i--) {
        // 有些浏览器不支持 options 属性的 remove 方法,
        // 但支持 DOM 的 removeChild 方法(比如:Konqueror)
        if (so.options.remove) {
            so.options.remove(i);
        }
        else {
            so.removeChild(so.options[i]);
        }
    }
}
 
/*
 * 设置 select 中的选项,该方法可复用
 *
 * so: 要设置选项的 select 对象
 *  d: 选项数据数组
 * vf: 选项值所对应的数组中的字段名
 * tf: 选项文本所对应的数组中的字段名
 */
function set_select(so, d, vf, tf) {
    for (var i = 0, n = d.length; i < n; i++) {
        var opt = document.createElement(option);
        opt.text = d[i][tf];
        opt.value = d[i][vf];
        // 有些浏览器不支持 options 属性的 add 方法,
        // 但支持 DOM 的 appendChild 方法(比如:Konqueror)
        if (so.options.add) {
            so.options.add(opt);
        }
        else {
            so.appendChild(opt);
        }
    }
}
 
// 设置省份的下拉菜单
function set_province_select(d) {
    var so = document.getElementById(province);
    set_select(so, d, id, name);
    // 设置首选省份的城市下拉列表
    change_province(1);
}
 
// 设置城市的下拉菜单
function set_city_select(d, vf, tf) {
    var so = document.getElementById(city);
    // 清空原有选项
    clear_select(so);
    // 设置新选项
    set_select(so, d, vf, tf);
}
 
// 当省份改变,相应的改变城市列表
function change_province(pid) {
    // 如果已缓存,则直接显示缓存中的列表
    if (city[pid]) {
        set_city_select(city[pid], id, name);
    }
    else {
        // 否则,先显示载入中
        set_city_select([[, Loading...]], 0, 1);
        // 然后调用远程过程载入城市信息
        // 调用远程过程时,最后一个参数指定的是回调函数
        rpc.get_city(pid, function (result) {
            // 把载入的数据放入缓存
            city[pid] = result;
            // 更新城市列表
            set_city_select(result, id, name);
        });
    }
}
 
// 定义当 rpc 客户端初始化(use_service)完毕后执行的内容
rpc.onready = function () {
    // 调用获取省份内容的远程过程,并设置回调函数为 set_province_select
    rpc.get_province(set_province_select);
}
下载: index.html
<html>
<head>
<script type="text/javascript" src="http://www.knowsky.com/phprpc_client.js"></script>
<script type="text/javascript" src="http://www.knowsky.com/area.js"></script>
</head>
<body onload="rpc.use_service(rpc.php);">
<select id="province" onchange="change_province(this.value);"></select>
<select id="city"></select>
</body>
</html>
上面的 html 中包含的 phprpc_client.js 是压缩版本(因为不需要用到加密,这里是 lite 压缩版)的,这样可以免去包含多个 js 文件的麻烦。

大家会发现这个程序不但可复用性好(比如 clear_select 和 set_select 两个函数也可以在其它程序中使用),而且使得整个程序的思路清晰,比如那个缓存功能,在这里实现的就非常的简单,而且效果也非常的好。

  • 演示程序
  • 实例下载
  • 通过 PHPRPC,你不需要再专注于服务器端和客户端的数据格式交换,不需要再去考虑 XmlHttpRequest 对象的创建和使用,PHPRPC 会自动帮你完成这一切,你只需要关注具体的事务就可以了。用 PHPRPC 来做 Ajax 编程,就是这么简单。


    文章整理:站长天空 网址:http://www.z6688.com/
    以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

    文章页数:[1] 


    放大字体显示 缩小字体显示 打印文章 推荐给朋友
    热门文章
    ·更改internet explorer的图标
    ·C#中的类型转换-.NET教程,C#语言
    ·找回flash的序列号sn
    ·更改ie的图标
    ·如何让你的VB6 IDE支持鼠标滚轮(过程)-.NET教程,VB.Net语言
    ·正则表达式Replace-.NET教程,Asp.Net开发
    ·Windows 2003下不注册组件用ASP发邮件-ASP教程,邮件相关
    ·防止ie被恶意修改的初级技巧
    ·asp.net实现分组全选部分复选框-ASP教程,ASP应用
    ·清理ie网址列表
    最新文章
    ·seo新手教程:title的写法_seo网站优化
    ·从注册表下手 切断一切黑客入侵的路径_注册表教程
    ·用flash 8 as代码写摄像头拍照功能_flash教程
    ·小站长赚钱思路:ip不到1000,一个月赚940元_网赚技巧
    ·陈艺光:网络游戏平台与游戏网站实现共赢_站长访谈
    ·留住访客 如何最优化设计网站的首页?(2)_站长心得
    ·为什么在google上搜不到我的网页?_google推广
    ·google的秘密 搜索引擎利用软件的魔力加快奔跑_google推广
    ·域名与网站排名_站长心得
    ·怎样避免被搜索引擎视为作弊_站长心得
    相关主题
  • 用 PHP 实现的简单线性回归(二)-PHP教程,PHP应用
  • 用 PHP 实现的简单线性回归:(一)-PHP教程,PHP应用
  • 用 PHP 使 Web 数据分析进入更高境界-PHP教程,PHP应用
  • 用 PHP 实现 XML 备份 Mysql 数据库-PHP教程,数据库相关
  • 用 PHP 开发健壮的代码(三):编写可重用函数-PHP教程,PHP技巧
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭