angularjs - 如何检测在 AngularJS 中完成的所有图像加载

标签 angularjs loading document-ready

我想用ng-repeat在一个页面中显示超过 100 张图像。这些图像在加载时需要花费大量时间,我不想向用户显示它们正在加载。所以,我只想在浏览器中加载所有内容后显示它们。

有没有办法检测是否所有图像都已加载?

最佳答案

您可以使用 load像这样的事件。

image.addEventListener('load', function() {
       /* do stuff */ 
});

Angular 指令

单图解决方案

HTML
<div ng-app="myapp">
    <div ng-controller="MyCtrl1">
        <loaded-img src="src"></loaded-img>
        <img ng-src="{{src2}}" />'
    </div>
</div>

JS
var myApp = angular.module('myapp',[]);
myApp
    .controller('MyCtrl1', function ($scope) {
            $scope.src = "http://lorempixel.com/800/200/sports/1/";
            $scope.src2 = "http://lorempixel.com/800/200/sports/2/";
    })
    .directive('loadedImg', function(){
        return {
            restrict: 'E',
            scope: {
                src: '='
            },
            replace: true,
            template: '<img ng-src="{{src}}" class="none"/>',
            link: function(scope, ele, attr){
                ele.on('load', function(){
                    ele.removeClass('none');
                });           
            }
        };
    });

CSS
.none{
    display: none;
}

http://jsfiddle.net/jigardafda/rqkor67a/4/

如果你看到 jsfiddle 演示,你会注意到 src图像仅在图像完全加载后显示,而在 src2 的情况下您可以看到图像加载。(禁用缓存以查看差异)

多张图片的解决方案

HTML
<div ng-app="myapp">
    <div ng-controller="MyCtrl1">
        <div ng-repeat="imgx in imgpaths" ng-hide="hideall">
            <loaded-img isrc="imgx.path" onloadimg="imgx.callback(imgx)"></loaded-img>
        </div>
    </div>
 </div>

JS
var myApp = angular.module('myapp',[]);
myApp
    .controller('MyCtrl1', function ($scope, $q) {

        var imp = 'http://lorempixel.com/800/300/sports/';

        var deferred;
        var dArr = [];
        var imgpaths = [];

        for(var i = 0; i < 10; i++){
            deferred = $q.defer();
            imgpaths.push({
                path: imp + i,
                callback: deferred.resolve
            });
            dArr.push(deferred.promise);
        }

        $scope.imgpaths = imgpaths;

        $scope.hideall = true;

        $q.all(dArr).then(function(){
            $scope.hideall = false;
            console.log('all loaded')
        });
    })
    .directive('loadedImg', function(){
        return {
            restrict: 'E',
            scope: {
                isrc: '=',
                onloadimg: '&'
            },
            replace: true,
            template: '<img ng-src="{{isrc}}" class="none"/>',
            link: function(scope, ele, attr){
                ele.on('load', function(){
                    console.log(scope.isrc, 'loaded');
                    ele.removeClass('none');
                    scope.onloadimg();
                });           
            }
        };
    });

要检测是否加载了所有图像,

对于每个图像,我生成了一个 deferred对象并传递了它的 deferred.resolve作为指令的图像加载回调,然后推送该 deferred对象 promise在一个数组中。之后我使用了 $q.all检测所有这些 promise 是否还没有解决。

http://jsfiddle.net/jigardafda/rqkor67a/5/

更新:添加了 Angular 方式。

更新:添加了加载多个图像的解决方案。

关于angularjs - 如何检测在 AngularJS 中完成的所有图像加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30198546/

相关文章:

Javascript:在脚本运行之前不要完成页面加载

angularjs - 在 meanjs 中注入(inject)自定义模块的最佳实践

javascript - 与 Angular 1.x 相比,绑定(bind)在 Angular 2 中的工作方式

javascript - 找到最接近的#loading 并显示它?

javascript - JavaScript 中 (function(){ 的含义

javascript - Angular 服务/值没有从 $(document).ready() 中获取新的 var

javascript - 如何通过javascript检测文档加载已经开始?

javascript - AngularJS JavaScript for 循环警告最多运行一次

javascript - 用 TypeScript 编写的 Geocoder 谷歌地图服务的 karma 异步测试

c# - asp.net 图像发布后未加载