近几个月来的工作是一个交易系统持续改进项目 迭代发布周期大约为 ~ 周 最近一次迭代是V 版 在礼拜三完成发布 不幸的是 第二天上午就被老大逮过去 原来老大从生产中揪出了一个bug 大致的问题如下
系统中有一个常用的自定义控件 目的是协助选择客户 而V 版的持续改进需求是给控纳亮件增加两个筛选选项 支持不同的默认值配置 很简单的一个需 求 代码修改也简单 其中一个修改是给一个js文件里边的一个函数增加了一个传入参数 用来传递配置值 经过RC R测试 一切都显得很正常 不过上 了生产才被发现bug了 加载出来的客户明显不正常 数目不对 也与预期的查询配置不相符
判茄森检查控件内部跳转链接 发现问题 传递的参数明显与预期不符 而这个链接则是由上面修改过的JS函数生成 因此判定问题是由于客户端缓存了原版JS 文件 新函数的调用由旧函数所替换引发的 经过清除缓存 重新加载页面后 这个自定义控件能够正常工作 很不幸的是 我们是不能通过打电话告诉每一位用 户 你需要清除缓存 然后才能正常使用这个功能
掘亩到此时 我才意识到需要一种方法来控件JS的缓存问题 否则 后续任何涉及JS文件内容的修改 都会因为缓存无法获取最新JS文件 而导致生产事故
原则上 我们是需要在有JS更新的时候 才会去重新加载JS文件 而不是每次都重新加载 因此第一种做法给JS应用地址后添加随机参数是不可取的 因为它意味着 几乎每次加载页面都会是重新加载JS 而不会合理的利用缓存JS 但是 我们还有第二种更合理的做法 如果关注过一些国外网站代码 会发现 他们通常是在js链接后添加一个版本号参数 而不是随机数 当js代码发生修改时 只需要将版本号加 就可以很巧妙的解决通知客户端更新js文件 不知道 谁是第一个想到这种方法的人 不过毫无疑问 他是值得我们钦佩的 真是一个不错的idea的!
lishixin/Article/program/java/JSP/201311/20638
② 29_用js实现一个省市级联效果
(1)var provs={},存储省市的json结构数据。
(2)function loadProv() {},此函数实现了初始化页面加载数据的功能。
(3)var prov = document.getElementById("prov"),获取存放省份的select下拉菜单。
(4)for (var key in provs),遍历json结构数据。
(5)var provName = key,获取省份的名称。
(6)var optProv = document.createElement("option"),创建一个option元素对象。
(7)optProv.value = provName,设置option元素的value属性值。
(8)optProv.innerText = provName,设置option显示的文本内容。
(9)prov.appendChild(optProv),将option元素添加到select下拉菜单。
(10)function provChange() {},作为onchange事件处理函数。
(11)var prov = document.getElementById("prov"),获取省份下拉菜单。
(12)var city = document.getElementById("city"),获取城市下拉菜单。
(13)var provName = prov.value,获取当前选中的省份的value值。
(14)if (provName == "none") {
city.style.display = "none";
return;
},如果值等于none,说明选中的是第一项,那么城市下拉菜单还是具有隐藏状态,并跳出函数。
(15)else {
city.style.display = "";
},否则的话显示出城市下拉菜单,默认状态它是隐藏的。
(16)var citys = provs[provName],获取城市,citys是个数组。
(17)for (var index = city.childNodes.length - 1; index >= 0; index--) {
var child = city.childNodes[index];
city.removeChild(child);
},遍历城市下拉菜单下的option元素,然后删除这些元素。
之所以清空就是为了防止当再次加载的时候出现累加情况。
(18)for (var index = 0; index < citys.length; index++) {},遍历数组中的元素,也就是城市。
(19)var optCity = document.createElement("option"),创建option元素。
(20)optCity.value = citys[index],设置option元素的value值。
(21)optCity.innerText = citys[index],设置option元素的文本内容。
(22)city.appendChild(optCity),将option元素添加select下拉菜单。
数据表形式数据
json形式数据
③ javascript实现点击省份出现城市功能
使用jq吧,很多操作可以简化,先引入jq文件
省份option的value写为省份的标示,就是省份和城市关联的字段
<script>
$(function(){
$('#dorp1').change(function(){
var province = $(this).val();
$.get("/控制器名/请求的方法名", {'id':province}, function(ret){
// ret是请求方法的返回值,在这里就是通过省份查到的城市数组
var city = '';
$.each(ret, function(i, o){
city += "<option value=" + o.城市id + ">" + o.城市名 + "<option>";
})
$("#dorp2").empty().append(city);
})
});
})
</script>
④ 怎么用js做一个地区选择控件的特效啊
1.
首先写一个js文件,areaLocation.js:
var
provinceArray=
new
Array();
provinceArray=[
{"pname":"江苏",
"country":[
{
"cname":"南京市",
"town":["玄武区","白下区","秦淮区","建邺区","雨花台","江宁区",
"六合区","溧水县","高淳县"]},
{
"cname":"南通市",
"town":["崇川区","港闸区","启东市","如皋市","通州市","海门市","海安县","如东县"]
},
{
"cname":"苏州市",
"town":["金阊区","沧浪区","平江区","虎丘区","吴中区","张家港","昆山市","吴江市","太仓市"]
}
]
},
{"pname":"上海",
"country":[
{
"cname":"上海市",
"town":["徐汇区","普陀区","杨浦区","虹口区","卢湾区","浦东区","黄浦区","长宁区","闸北区","静安区","闵行区","松江区"]
}
]
}
];
function
areaInitialize(){
province.length=1;
for(var
i
=
0;i<provinceArray.length;i++){
var
pro
=
provinceArray[i].pname;
province.options[province.length]
=
new
Option(pro,pro);
}
}
function
changeCLocation(id,city){
//alert(id);
city.length
=
0;
if(id>0){
var
j=id-1;
var
i;
var
countrys
=
new
Array();
countrys
=
provinceArray[j].country;
city.options[0]
=
new
Option('不限','');
for
(i=0;i
<
countrys.length;
i++){
var
cname
=
countrys[i].cname
city.options[city.length]
=
new
Option(cname,
cname);
}
changeTLocation(id,1,town);
}else
if(id==0){
city.length
=
0;
town.length
=
0;
city.options[city.length]
=
new
Option('不限','');
town.options[town.length]
=
new
Option('不限','');
}
}
function
changeTLocation(pid,cid,town){
//alert(cid);
var
countrys
=
new
Array();
var
towns
=
new
Array();
town.length
=
0;
var
i;
countrys
=
provinceArray[pid-1].country;
areaId
=
countrys[cid-1].areaId;
towns
=
countrys[cid-1].town
city.options[0]
=
new
Option('不限','');
town.options[0]
=
new
Option('不限','');
for
(i=0;i
<
towns.length;
i++){
var
tname
=
towns[i]
town.options[town.length]
=
new
Option(tname,tname);
}
town.options[0]
=
new
Option('不限','');
}
2.
再写一个html页面:
<!DOCTYPE
HTML
PUBLIC
"-//W3C//DTD
HTML
4.01
Transitional//EN">
<html>
<head>
<script
type="text/javascript"
></script>
<script
type="text/javascript">
window.onload=areaInitialize();
</script>
</head>
<body>
<select
size="1">
<option
value=0
selected>--请选择--</option>
</select>
<select
size="1"
>
<option
value=0
selected>--请选择--</option>
</select>
<select
size=1>
<option
value=0
selected>--请选择--</option>
</select>
</body>
</html>
⑤ 怎样用js实现省市联动,数据是从数据库读取 谢谢了
省市联动,要去读数据库就慢了点,而且用的资源也多
由于省市数据是固定的,通常,我专会独立定义一个js文件属,里面是一个json数据,分级存储省市数据,每个地区都有一个六位的代码,就是你身份证的前六位,那是精确到县级的~
当然,如果你只需要到地级市,那就弄两级的就行啦
js读取js,是很快的~