Javascript Safari 10.0.1$window.open in.然后$http.get的返回未定义

Javascript Safari 10.0.1$window.open in.然后$http.get的返回未定义,javascript,angularjs,google-chrome,safari,Javascript,Angularjs,Google Chrome,Safari,在MacOS Sierra上的safari上下载pdf文档时出现问题。我们从服务器获取数据URL,然后使用$window.open和createObjectURL将文件推送到浏览器。但这一切其实并不重要。但这里有一个片段来重现我的问题: myApp.controller('MyCtrl', function($scope, $window, $http) { $scope.open = function() { var windowy = $window.o

在MacOS Sierra上的safari上下载pdf文档时出现问题。我们从服务器获取数据URL,然后使用$window.open和createObjectURL将文件推送到浏览器。但这一切其实并不重要。但这里有一个片段来重现我的问题:

myApp.controller('MyCtrl', function($scope, $window, $http) {       
    $scope.open = function() {
        var windowy = $window.open('', '_blank');
        console.log('1');
        console.log(windowy);
        $http.get('http://httpbin.org/delay/0').then(function(response) {
            var windowx = $window.open('', '_blank');
            console.log('2');
            console.log(windowx);
        });
    }
});
我创建了一个JSFIDLE来说明问题,url是:

这是chrome(mac)的日志

这是safari 10(mac)的日志


为什么safari上的窗口在$http.get(…)中没有定义。然后(…)

我们以务实的方式解决了我们的问题,也许不是最优雅的解决方案,但现在它可以解决问题

myApp.controller('MyCtrl', function($scope, $window, $http) {       
    $scope.open = function() {
        var window = $window.open('', '_blank');
        $http.get('http://httpbin.org/delay/0').then(function(response) {
            console.log(window);
        }, function() {
            window.close();
     });
    } 
});

弹出窗口拦截器。为什么第一个window.open没有被阻止?因为您可能执行了单击操作…没有。ajax调用是异步的,因此它没有附加到单击事件。延迟是将其与单击事件分离的部分。如果将它放在setTimeout中,同样的事情也会发生。为什么要使用Ajax调用?使用您正在进行Ajax调用的url设置弹出窗口,并设置适当的标题以强制下载。