1

ハングしているページを JS で解決するにはどうすればよいでしょうか。

私はこのようにテストしている JS ループを持っていますが、永遠にハングしているようです - スクリプトを完了している間にハングを止める方法はありますか?:

<div id="my_data"></div>

<script>
function test(value){
output= [];
do{ 
    value++;
    output.push(value);
    document.getElementById('my_data').innerHTML = (output.join(''));
}while(value < 10000000);
alert('end'); // never occurs
}

test(0);
</script>
4

6 に答える 6

7

ますます長くなる文字列で DOM を 1000 万回更新しています。

あなたが未来から来たある種の超人なら、おそらくこれは理にかなっています.

于 2012-05-30T04:11:26.360 に答える
5

Javascript はシングル スレッドであるため、ループを実行している間は何も起こりません。これは 1,000 万回実行されており、実行のたびに #my_data の innerHTML を新しいものに設定しています。それは非常に非効率的で、役に立たないようです。何を達成しようとしていますか?

于 2012-05-30T04:12:23.003 に答える
4

連続する数字を連結10,000,000して文字列にしますが、これは最新のスーパーコンピューターではうまく機能しません。

進行状況をポーリングしたい場合は、タイマーをセットアップして少し遅くします。実用的ではありませんが、見栄えがします: http://jsfiddle.net/V6jjT/2/

HTML:

<div id="my_data"></div>

脚本:

var value = 0;
var interval = setInterval(function() {
    if (value > 100) {
        clearInterval(interval);
        return;
    }

    value++;
    document.getElementById('my_data').innerHTML += ' ' + value;
}, 10);
于 2012-05-30T04:12:13.990 に答える
3

そのようなタイトなループを実行すると、完了するまで何も更新されません。しかも10M配列アイテム?!

本当にこれを行い、ブラウザを永遠にハングさせたくない場合はsetInterval、その間にブラウザを更新できるようにする必要があります。

function updater(value, max, interval) {
  var output = [],
  node = document.getElementById('my_data'),
  tid = setInterval(function() {
    if (value++ < max) {
      output.push(value);
      node.innerHTML = (output.join(''));
    } else {
      alert('done');
      clearInterval(tid);
    }
  }, interval);
}

updater(0, 10, 200);
于 2012-05-30T04:11:56.297 に答える
1

反復ごとに HTML を更新しないでください。

function test(value){
    output= [];
    do { 
        value++;
        output.push(value);
    } while(value < 10000000);
    document.getElementById('my_data').innerHTML = (output.join(''));
    alert('end'); // never occurs
}

動作するはずです (ただし、HTML 内の 1,000 万の数字はレンダリングに時間がかかります)。

実行中の数値を確認したい場合は、以下を参照してくださいwindow.setInterval。ブラウザは、js の実行とビューの更新の間に時間が必要です。そのため、複数のデータ チャンクを非同期で実行するコードを書き直す必要があります。以下も参照してください。

于 2012-05-30T04:13:36.187 に答える