我在我的PHP程序中加入了javascript: 尝试检查我的代码。
它的循环取决于数据库中的记录数。 例如:
$counter = 0;
foreach($row_value as $data):
echo $this->javascript($counter, $data->exrate, $data->tab);
endforeach;
private function javascript($counter=NULL, $exrate=NULL, $tab=NULL){
$js = "
<script type='text/javascript'>
$(function () {
var textBox0 = $('input:text[id$=quantity{$counter}]').keyup(foo);
var textBox1 = $('input:text[id$=mc{$counter}]').keyup(foo);
var textBox2 = $('input:text[id$=lc{$counter}]').keyup(foo);
function foo() {
var value0 = textBox0.val();
var value1 = textBox1.val();
var value2 = textBox2.val();
var sum = add(value1, value2) * (value0 * {$exrate});
$('input:text[id$=result{$counter}]').val(parseFloat(sum).toFixed(2));
// Compute Total Quantity
var qtotal = 0;
$('.quantity{$tab}').each(function() {
qtotal += Number($(this).val());
});
$('#tquantity{$tab}').text(qtotal);
// Compute MC UNIT
var mctotal = 0;
$('.mc{$tab}').each(function() {
mctotal += Number($(this).val());
});
$('#tmc{$tab}').text(mctotal);
// Compute LC UNIT
var lctotal = 0;
$('.lc{$tab}').each(function() {
lctotal += Number($(this).val());
});
$('#tlc{$tab}').text(lctotal);
// Compute Result
var result = 0;
$('.result{$tab}').each(function() {
result += Number($(this).val());
});
$('#tresult{$tab}').text(result);
}
function add() {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
if (IsNumeric(arguments[i])) {
sum += parseFloat(arguments[i]);
}
}
return sum;
}
function IsNumeric(input) {
return (input - 0) == input && input.length > 0;
}
});
</script>
";
return $js;
}
当我在IE7上运行此消息时,此消息总是令我烦恼
停止运行此脚本?
此页面上的脚本导致您的网络浏览器 慢慢地跑如果它继续运行,您的计算机 可能会变得没有反应。
但是在Firefox中它运行良好。
答案 0 :(得分:0)
IE在确定脚本耗时过长时会显示该消息(实际上其他浏览器都有类似的警告,但它们并非都以相同的方式计算“太长”并且不会以相同的速度运行)。
你实际上并没有问过一个问题,但我想你想知道如何让你的脚本更有效率,以便它(我们希望)在触发IE消息之前完成?
我非常喜欢jQuery,但是使用它确实涉及很多函数调用,包括带回调的嵌套函数等,一旦你开始将这些函数放在循环中(在你的情况下是多个循环),它会变得非常低效。如果您只处理少量项目,这可能对用户来说不明显,但如果您正在处理很多事情,那么您可以更改的第一件事就是加快代码速度,这将改变.each()
循环到标准for
循环:
// CHANGE
var qtotal = 0;
$('.quantity{$tab}').each(function() {
qtotal += Number($(this).val());
});
// TO
var qtotal = 0,
$q = $('#tquantity{$tab}');
for (i = 0; i < $q.length; i++)
qtotal += +$q[i].value;
请注意,在for
循环中,我直接使用了DOM元素的value
属性,而不是使用jQuery通过.val()
检索它(即使在.each()
之内可以用this.value
而不是$(this).val()
来完成。我还使用unary plus operator代替Number()
。这意味着在循环迭代中根本没有函数调用,而你的方式是调用Number()
,$()
和.val()
(甚至没有计算jQuery在$()
内进行的额外处理{1}}和.val()
)。
对所有.each()
循环进行类似的更改(在函数开头声明i
并在每个循环中重复使用它),您应该会看到一些改进。