<script type="text/javascript">
$(document).ready(function() {
var data = {};
$(".inpbot1").each(function (index, obj) {
data[index] = $(this).val();
showResult();
$(obj).bind("blur", function () {
data[index] = $(this).val();
showResult();
}).bind("keyup", function () {
var v = $(this).val();
$(this).val(v.replace(/[^\d\.]/g, '0'));
});
});//
function showResult() {
var r = 0;
for (var i = 0; i < $(".inpbot1").length; i++) {
if (data[i]) {
r += parseFloat(data[i]);
}
}
$("#labAllResult").html(r);
$.ajax({
type: "GET",
url: "DaXie.ashx",
data: "r=" + r,
success: function (msg) {
$("#Label1").html(msg);
}
});
}
}); </script>
功能已经实现了,将页面中所有class相同的文本框值相加,如果其中某一个文本框值修改,总结果也自动显示新结果了.不过页面运行速度卡,此代码应该不和谐,望高手指点具体的代码怎么改?
i < $(".inpbot1").length; i++
避免这种代码,每次循环时候都会$()一次,东西是不变的,可以把length存起来放在前面2.
bind("keyup", function () {
var v = $(this).val();
$(this).val(v.replace(/[^\d\.]/g, '0'));
});
每次keyup时候会触发一系列操作,按键快的时候就会卡,没用过jquery,不知是否有函数缓冲的功能,看jq这么强大应该有
类似
bind("keyup", function () {}, {buffer: 200});
没有的话可以自己写一个
$(this).val(v.replace(/[^\d\.]/g, '0'));可以改成var el = $(this);
v = el.val();
el.val...性能都是这么一点点消耗掉的
r += parseFloat(data[i]);
}
如果是字符串的链接操作 +=是要做6步事情的 所以我们用数组push代替+=操作 效率快的多
如何push? 简单的说下
var arr = [];
for(条件略){
arr.push(值);
}
arr.join("");这是一个优化点 楼上的更是一个比较常见的优化点 还有其他的优化点
楼主自己要动手查查资料 不能只靠别人 对吧 ^_^
<script type="text/javascript">
$(document).ready(function() {
var data = {},
//缓存$(".inpbot1"),因为元素每次length都会重排一下渲染树,对性能影响很大,所以要把length缓存起来
els = $(".inpbot1"),
length = els.length;
els.each(function (index, obj) {
//缓存$(this),data
var $this = $(this),
//data多次用到,而它是一个全局变量,每次访问都要遍历多层作用域才找到,所以要缓存起来
_data = data;
_data[index] = $this.val();
//showResult多次访问_data,以参数形式传入,在函数内作为局部变量使用,length同理
showResult(_data, length);
$this.bind("blur", function () {
_data[index] = $this.val();
showResult(_data, length);
}).bind("keyup", function () {
var v = $this.val();
$this.val(v.replace(/[^\d\.]/g, '0'));
});
});
function showResult(_data, _length) {
var r = 0;
for (var i = 0; i < _length; i++) {
//缓存data[i]
var d = _data[i];
//现在已经没必要改成数组形式push了,因为很多浏览器都优化了字符串“+”的操作,push反而更慢,好像只有IE6用数组push才会快
if (d) {
r += parseFloat(d);
}
}
//如果没一定顺序关系的话循环可以改成这样,i--为0时跳出
/*for (var i = length; i--;) {
var d = _data[i];
if (d) {
r += parseFloat(d);
}
}*/
$("#labAllResult").html(r);
$.ajax({
type: "GET",
url: "DaXie.ashx",
data: "r=" + r,
success: function (msg) {
$("#Label1").html(msg);
}
});
}
}); </script>