脚本执行在Internet Explorer中超时

时间:2012-06-21 03:06:51

标签: php javascript internet-explorer-7

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

1 个答案:

答案 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并在每个循环中重复使用它),您应该会看到一些改进。