-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で実行すると、このメッセージは常に私を悩ませます

このスクリプトの実行を停止しますか?

このページのスクリプトが原因で、Web ブラウザの動作が遅くなっています。実行し続けると、コンピューターが応答しなくなる可能性があります。

しかし、Firefoxではうまく機能しています。

4

1 に答える 1

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ループでvalueは、jQuery を使用してそれを取得するのではなく、DOM 要素のプロパティを直接使用したことに注意してください.val()(これは、ではなく、内部でも.each()行うことができます)。の代わりに単項プラス演算子も使用しました。これは、ループ反復で関数呼び出しがまったくないことを意味しますが、あなたの方法には, andへの呼び出しがありました ( jQuery がand内の舞台裏で行う追加の処理を数えていません)。this.value$(this).val()Number()Number()$().val()$().val()

すべての.each()ループに同様の変更を加える (関数の先頭で宣言iし、ループごとに再利用する) と、改善が見られるはずです。

于 2012-06-21T04:00:56.467 に答える