-2

我在我的 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 中它运行良好。

4

1 回答 1

0

当 IE 确定脚本运行时间过长时,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循环中,我value直接使用了 DOM 元素的属性,而不是使用 jQuery 来检索它.val()(即使在.each()你内部也可以使用this.value而不是$(this).val())。我还使用了一元加运算符而不是Number(). 这意味着在循环迭代中根本没有函数调用,而您的方式调用了Number(), $()and (甚至不计算 jQuery 在and.val()中在幕后所做的额外处理)。$().val()

.each()对所有循环进行类似的更改(i在函数开头声明并为每个循环重新使用它),您应该会看到一些改进。

于 2012-06-21T04:00:56.467 回答