3

私のeval()呼び出しはかなり集中的で、各ソリューションを生成するのに約 1 秒かかります。

したがって、各段落要素を生成するのに約 1 秒かかります (これを dom - に追加しますdocument.getElementById('project_euler_solutions').appendChild(p); )。

したがって、各段落が約 1 秒間隔で Web ページに表示されることを期待していました。(つまり、約 40 秒後には 40 段落が表示されます)。

しかし、ボタンをクリックすると、40 秒間何も起こらず、すべてのソリューションが一度に表示されます。

dom を更新する前に、それらすべてが終了するのを待つのはなぜですか?

DOMに追加されるとすぐに各段落が表示されると思いました

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
    <script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.6.2.min.js"></script>
    <script src="/statics/project_euler.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $("button").click(function(){
                for (var i in window) {
                    if (i.slice(0,5) == "solve") {
                        var p = document.createElement('p');
                        p.innerHTML = "running: " + i;
                        document.getElementById('project_euler_solutions').appendChild(p);
                        var p = document.createElement('p');
                        p.innerHTML = "Solution: " + eval(i + "()");
                        document.getElementById('project_euler_solutions').appendChild(p);
                    }
                }
            });
        });
    </script>
</head>

<body>
<div id="project_euler_solutions"><button>Calculate solutions</button></button></div>
</body>
</html>
4

2 に答える 2

5

JavaScript は UI と同じスレッドで実行されるため、DOM がすべての変更を再描画できるように制御を戻す必要があります。

于 2012-06-06T04:02:05.160 に答える
1

リフローを強制します。

    $(document).ready(function(){
        $("button").click(function(){
            for (var i in window) {
                if (i.slice(0,5) == "solve") {
                    var p = document.createElement('p');
                    p.innerHTML = "running: " + i;
                    document.getElementById('project_euler_solutions').appendChild(p);
                    var p = document.createElement('p');
                    p.innerHTML = "Solution: " + eval(i + "()");
                    document.getElementById('project_euler_solutions').appendChild(p);
                    document.getElementById('project_euler_solutions').offsetHeight; //Force a reflow
                }
            }
        });
    });

図面間にタイムアウトを設定することもできます:

    var keys = Object.keys(window).filter(function(i){
        return i.slice(0,5) === "solve";
    });

    (function (i){
        (function k(){
            var p = document.createElement('p');
            p.innerHTML = "running: " + keys[i];
            document.getElementById('project_euler_solutions').appendChild(p);
            var p = document.createElement('p');
            p.innerHTML = "Solution: " + eval(keys[i] + "()");
            document.getElementById('project_euler_solutions').appendChild(p);
            if( i++ < keys.length - 1 ) {
                setTimeout(k, 0);
            }            
        })()
    })(0)
于 2012-06-06T04:05:00.317 に答える