// 用的ajax加载,ajax没做兼容封装,所以不兼容ie6,联动后会有颜色动画
// code:
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<script src="ADS.js"></script>
<script src="myLogger.js"></script>
<title></title>
</head>
<body>
<select name="postalCode" id="postalCode">
<option value="518049">518049</option>
<option value="510000">510000</option>
<option value="0">0</option>
</select>
<br>
<input id="street" type="text">
<input id="city" type="text">
<input id="province" type="text">
<script>
function isPostalCode(s) {
return (s.length === 6);
}
function FadeColor(from, to, callback, duration, framesPerSec) {
this.from = from;
this.to = to;
this.callback = callback;
// 以秒表示的渐变效果持续时间
this.duration = duration || 1;
// 在给定持续时间内动画的帧数
this.framesPerSec = framesPerSec || this.duration * 15;
}
// setTimeout()的包装函数
// 用于基于帧数计算延迟时间
FadeColor.prototype.doTimeout = function (color, frame) {
var that = this;
setTimeout(function () {
try {
that.callback(color);
} catch (e) {
// 对异常进行调试
ADS.log.write(e);
}
}, (that.duration * 1000 / that.framesPerSec) * frame);
};
FadeColor.prototype.init = function () {
var r, g, b;
var frame = 1;
// 在第0帧设置渐变的开始颜色
this.doTimeout('rgb(' + this.from.r + ',' + this.from.g + ',' + this.from.b + ')', 0);
// 计算两帧之间RGB值的改变量
while (frame < this.framesPerSec + 1) {
// 不断接近目标的值
r = Math.ceil(this.from.r * ((this.framesPerSec - frame) / this.framesPerSec)
+ this.to.r * (frame / this.framesPerSec));
g = Math.ceil(this.from.g * ((this.framesPerSec - frame) / this.framesPerSec)
+ this.to.g * (frame / this.framesPerSec));
b = Math.ceil(this.from.b * ((this.framesPerSec - frame) / this.framesPerSec)
+ this.to.b * (frame / this.framesPerSec));
// 为这一阵调用延时函数
this.doTimeout('rgb(' + r + ',' + g + ',' + b + ')', frame);
frame++;
}
};
ADS.addEvent(window, 'load', function () {
var postalCode = ADS.$('postalCode');
var a = function (s) {
var a1 = new FadeColor({
// 起始颜色
r: 0,
g: 255,
b: 0
}, {
// 结束颜色
r: 255,
g: 255,
b: 255
}, function (color) {
// 将颜色应用到元素中
ADS.setStyle(s, {
'background-color': color
});
});
return a1.init();
};
ADS.addEvent(postalCode, 'change', function () {
var newPostalCode = this.value;
if (!isPostalCode(newPostalCode)) {
return;
}
var req = new XMLHttpRequest();
req.open('POST', 'serve.js?postalCode=' + newPostalCode, true);
req.onreadystatechange = function () {
if (req.readyState === 4) {
if (req.status >= 200 && req.status < 300 || req.status === 304) {
eval(req.responseText);
if (ADS.$('street').value !== street) {
ADS.$('street').value = street;
a('street');
}
if (ADS.$('city').value !== city) {
ADS.$('city').value = city;
a('city');
}
if (ADS.$('province').value !== province) {
ADS.$('province').value = province;
a('province');
}
}
}
};
req.send();
});
});
</script>
</body>
</html>
// serve.js:
var street,city,province;
if(newPostalCode == '518049'){
street = '123 Somewhere';
city = 'Ottawa';
province = 'Ontario';
} else {
street = 'asdasd';
city = 'asdasd';
province = 'Oasdasd';
}