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,第二个按钮不使用。

$('#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 回答