0

過去数か月から、私は多くの JS を行ってきましたが、大学や本などから実際に学んだことはありません。

ここに質問があります:

$scope.selectTab = function($index, tab) {
    $scope.template = $scope.templates[$index];
    $scope.data.tabSelected = tab;
    setTimeout(function() {
        console.clear();
        console.log($scope.template);
        console.log(document.getElementById("SomeDiv"))
        console.log("Going to draw now...")
        draw_analytics($scope); // Draw on SomeDiv
    }, 0);
}

上記のコードが機能している間。しかし、以下のものはそうではありません。

$scope.selectTab = function($index, tab) {
    $scope.template = $scope.templates[$index];
    $scope.data.tabSelected = tab;
    console.clear();
    console.log($scope.template);
    console.log(document.getElementById("SomeDiv"))
    console.log("Going to draw now...")
    draw_analytics($scope);
}

タブ操作にAngularJSを使用していますが、それは無関係だと思います。上のコードでは、SomeDivdom を取得しようとすると、実際には HTML コンテンツが返されますが、下のコードでnullは返されます。

4

1 に答える 1

1

無名関数で settimeout を使用すると、すぐには実行されません。現在のイベントが終了した後に実行されるキューに追加します。

これは、ただちに実行する settimeout なしで実行するのとは対照的です。

推測するに、「SomeDiv」はタブの変更で作成または操作されています。そのため、コードをすぐに実行すると、div が実際に作成される前にコードが実行される状況が発生する可能性があります。「settimeout」の呼び出し中は、実行前に現在のイベントが完了するまで待機します。イベントとインラインのように見えますが、実際には匿名関数を最後に実行するようにスケジュールしているだけです。

私が話していることを説明するためにフィドルを作成しました。 http://jsfiddle.net/pS54r/

settimeout を使用する最初のボタン、2 番目のボタンは使用しません。

$('#clickme').click(function () {
    WriteToDiv('First Button 1');
    setTimeout(function () {
        WriteToDiv('First Button 2');
    }, 0);
    WriteToDiv('First Button 3');
});

$('#clickme2').click(function () {
    WriteToDiv('Second Button 1');
    WriteToDiv('Second Button 2');
    WriteToDiv('Second Button 3');
});
于 2013-10-10T12:32:01.740 に答える