异步载入省市县关联菜单
做web开发的过程中遇到要用国标代码中的GB/T2260《中华人民共和国行政区划码》,该标准共有3500条数据,如果采用一个表来存储,载入页面时采用同步载入的方法显然速度会让人无法忍受。只有从两个方面入手解决这个问题,一是想办法把表拆开,省市县分别存储在三个表中,但由于系统要进行国家标准化测试,数据库是“神圣不可侵犯的”,因此只有在程序上下工夫了。
仔细研究该代码后发现它的规律性很强,省市县分别有自己的规律,比如河北省(130000)、石家庄市(130100)、长安区(130102),规律已经很明显了,省一级的代码后4位必定为0,市一级的代码后两位必定为0。省市县依据从属关系也会有至少两位代码是相同的。因此我想到了使用SQL中的like。
具体步骤如下:
(1)第一级菜单载入时要从数据库中取出全国所有的省“select * from GB/T2260 where code like '__0000'”。
(2)第二级菜单则根据用户选择的省求出该省求出该省下属的市,假设选择了“河北省”,“select * from GB/T2260 where code like '13__00'”。
(3)第三级菜单求出用户所选市下属的县(区),假设选择的是“石家庄市”,“select * from GB/T2260 where code like '1301__'”。
至此流程已经清晰了,剩下的就是程序如何实现的问题了。我过去做的联动菜单要么是同步载入的,要么就是刷新页面的异步载入。此处的要求是不刷新页面的前提下实现异步载入。问题集中在如何在前一级菜单onChange后触发后台程序的运行,并将值返回到当前页面的下一级菜单。由于我一直以来都是用PHP对JS很不熟悉,因此这一步走了不少弯路,最终的方法感觉不是很好,希望感兴趣的朋友讨论一下更好的办法。
我的方法是在页面上建立一个隐藏的iframe:"<IFRAME id=hiddenframe src="bergkamp.htm" width=0 height=0></IFRAME>",通过js改变它的src从而触发后台程序的运行。返回的结果使用innerHTML输出整个select。至此程序完成,运行时发现还有香港、澳门两个特别行政区也是属于省一级的,但它们并没有下一级行政区,这样就需要在提交表单时判断用户选择到哪一级。
终于大功告成!