2012-06-21 85 views
-2

我在我的PHP程序中加入了JavaScript: 請嘗試檢查我的代碼。Internet Explorer中的腳本執行超時

它循環取決於數據庫中的記錄數。 例如:

$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中,它運行良好。

+2

因此,採取調試器並進行調試 – zerkms

+1

通常意味着你有一個循環耗時過長。有你的起點去調試。另外IE7正在消失。這是新的IE6。 – epascarello

+1

_「[IE7]是新的IE6」_ - 在@epascarello這麼多級別上都是如此。 – nnnnnn

回答

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而不是​​。這意味着在循環迭代中根本沒有函數調用,而您的方式調用了​​,$().val()(甚至沒有計算jQuery在幕後$().val()內執行的額外處理)。

對所有.each()循環作出類似的更改(在函數的開頭聲明i並在每個循環中重新使用它),並且應該看到一些改進。

+0

你可以修改我的代碼到DOM嗎? –

+0

對不起,我不明白你的意思。 – nnnnnn