自从过去几个月以来,我一直在做很多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进行一些标记,但我认为这无关紧要。
在顶部代码中,当我尝试获取SomeDiv
dom时,我实际上得到了它的HTML内容,而在底部代码中,返回了null
。
答案 0 :(得分:1)
将settimeout与匿名函数一起使用时,它不会立即执行。它将它添加到当前事件结束后要执行的队列中。
这与没有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');
});