2012-06-21 5 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에서이 작업을 실행 나를

정지이 스크립트를 실행 짜증나는 항상?

이 페이지의 스크립트를 사용하면 웹 브라우저가 으로 천천히 실행됩니다. 계속 실행하면 컴퓨터 이 응답하지 않을 수 있습니다.

하지만 파이어 폭스에서는 잘 작동합니다.

+2

따라서 디버거를 사용하고 디버그하십시오. – zerkms

+1

일반적으로 너무 오래 걸리는 루프가 있습니다. 디버깅을위한 출발점이 있습니다. 또한 IE7도 사라지고 있습니다. 새로운 IE6입니다. – epascarello

+1

_ "[IE7]은 새로운 IE6입니다."_epascarello는 많은 수준에서 그렇습니다. – nnnnnn

답변

0

IE는 스크립트가 너무 오래 걸린다 고 결정하면 해당 메시지를 표시합니다 (실제로 다른 브라우저는 비슷한 경고를 표시하지만 모두 "너무 길다"는 동일한 방식으로 계산하지는 않으며 같은 방식으로 모두 실행하지는 않습니다). 속도).

실제로 질문을하지는 않았지만 스크립트를보다 효율적으로 작성하여 IE 메시지가 트리거되기 전에 완료하는 방법을 알고 싶다고 가정합니다.

나는 jQuery를 많이 좋아하지만, 콜백 등으로 중첩 된 함수를 포함하여 많은 함수 호출을 필요로한다. 일단 루프 내에서 이러한 함수를 넣기 시작하면 무능한. 적은 수의 항목 만 처리하는 경우 사용자에게 눈에 띄지 않을 수 있지만 많이 처리하는 경우 코드 변경 속도를 올리면 변경 될 수 있습니다. 루프가 표준 for으로 변경됩니다. 루프 다음 ​​for 루프에서 나는 (심지어 .each()에서 당신이 this.value보다는 $(this).val()으로 수행 한 수있는) .val()를 통해 그것을 검색 할 jQuery를 사용하는 것보다 직접 오히려 DOM 요소의 value 속성을 사용했다고

// 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; 

주 . 또한 Number() 대신 unary plus operator을 사용했습니다. 이것은 루프 반복에서 전혀 함수 호출을하지 않는 반면, 자신의 방법은 Number(), $().val() (심지어 jQuery가 $().val() 내에서 수행하는 추가 처리를 계산하지 않음)에 대한 호출이 있었음을 의미합니다.

.each() 루프 (기능 시작 부분에 i을 선언하고 각 루프마다 다시 사용)에 대해 비슷한 변경을 수행하면 몇 가지 개선 사항이 표시됩니다.

+0

내 코드를 DOM으로 개정 할 수 있습니까? –

+0

죄송합니다, 무슨 뜻인지 이해가 안됩니다. – nnnnnn

관련 문제