如何检测在 AngularJS 内完成的所有图像加载
How to detect all imges loading finished in AngularJS
我想使用 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
来检测所有这些承诺是否已经解决。
http://jsfiddle.net/jigardafda/rqkor67a/5/
更新: angular 添加方式。
更新: 添加了加载多张图片的解决方案。
检查是否所有图片都已加载
jQuery.fn.extend({
imagesLoaded: function( callback ) {
var i, c = true, t = this, l = t.length;
for ( i = 0; i < l; i++ ) {
if (this[i].tagName === "IMG") {
c = (c && this[i].complete && this[i].height !== 0);
}
}
if (c) {
if (typeof callback === "function") { callback(); }
} else {
setTimeout(function(){
jQuery(t).imagesLoaded( callback );
}, 200);
}
}
});
- 所有图片加载完毕回调
- 图像加载错误被忽略(完整为真)
- 使用:
$('.wrap img').imagesLoaded(function(){
alert('all images loaded');
});
注意:这段代码对我有用,来源:
http://wowmotty.blogspot.in/2011/12/all-images-loaded-imagesloaded.html
我想使用 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
来检测所有这些承诺是否已经解决。
http://jsfiddle.net/jigardafda/rqkor67a/5/
更新: angular 添加方式。
更新: 添加了加载多张图片的解决方案。
检查是否所有图片都已加载
jQuery.fn.extend({
imagesLoaded: function( callback ) {
var i, c = true, t = this, l = t.length;
for ( i = 0; i < l; i++ ) {
if (this[i].tagName === "IMG") {
c = (c && this[i].complete && this[i].height !== 0);
}
}
if (c) {
if (typeof callback === "function") { callback(); }
} else {
setTimeout(function(){
jQuery(t).imagesLoaded( callback );
}, 200);
}
}
});
- 所有图片加载完毕回调
- 图像加载错误被忽略(完整为真)
- 使用:
$('.wrap img').imagesLoaded(function(){ alert('all images loaded'); });
注意:这段代码对我有用,来源:
http://wowmotty.blogspot.in/2011/12/all-images-loaded-imagesloaded.html