在SO中有很多关于我们如何使用角度指令来知道图像何时被加载的例子。这些示例描述了一个直接应用于img元素的指令,如下所示:
<img ng-src="myimage.jpg" my-great-directive />
然后在指令“my-great-directive”
中我们可以做:
element.bind("load" , function(e){ }
我工作得很好。
然而,如果构造是这样的:
<div my-great-directive>
<img ng-src="myimage.jpg" />
</div>
在my-great-directive中,如何绑定内部图像加载事件?
这对我来说不是一个理论上的问题。我正在使用名为angular-carousel-slider的第三方滑块,它包裹起来像这样:
<ul rn-carousel rn-carousel-buffered
rn-carousel-index="mycarousel.index"
rn-carousel-auto-slide="0.3" rn-carousel-pause-on-hover >
<li ng-repeat="slide in slides">
<img ng-src="{{eventBasePath}}{{slide.img}}?rand={{rand}}"/>
</li>
</ul>
我正在尝试修改其代码,以便它不会滑动到下一个图像,除非当前图像已完全加载(以避免快速滑块半加载图像并移动到下一个图像的情况)。我被困在如何在指令中捕获这个图像加载事件。执行element.bind("load")
不起作用,因为指令未应用于图像元素。
谢谢!
答案 0 :(得分:6)
查看此工作演示:JSFiddle
使用anguler.element
查找img
元素并绑定事件。
在你的指令中,它应该是element.find('img')
。
angular.module('Joy', [])
.directive('hello', [function () {
return {
restrict: 'A',
link: function (scope, ele) {
var img = ele.find('img');
console.log(img);
img.bind('load', function () {
console.log('img is loaded');
});
}
};
}]);
HTML:
<div ng-app="Joy">
<div hello>
<img ng-src="https://www.google.com.hk/images/srpr/logo11w.png">
</div>
</div>
如果使用ng-repeat
,请先添加$timeout
等待ng-repeat
完成。查看工作演示:JSFiddle。
注意:此演示正在加载非常大的图像。加载图片后,将显示文字img is loaded
。
如果事件绑定不起作用,请尝试本机image.onload
绑定(或oncomplete
以查找缓存的图像)。工作演示:JSFiddle。