我正在使用 Knockout.js 显示从我的服务器返回的搜索结果列表。结果集中的每个结果都包含一个图像。我正在尝试为每个图像的加载事件附加一个处理程序,以便我可以根据所有图像的最大高度调整图像的父 div 的大小,但加载事件似乎在图像完成加载之前触发。
此外,我可以看到加载处理程序在 firebug 中被击中,但调试行为只是让图像有时间加载,因此在调试时一切正常。
我的 viewModel 中的负载处理程序:这会将已解析的 deferred 推送到我的 promises 数组中。然后我要做的就是检查以确保数组已满,这将告诉我图像已加载。
self.imageLoadHandler = function() {
var promise = $.Deferred().resolve;
promises.push(promise);
};
负载处理程序的绑定
<img data-bind="attr: { src: Posters.Detailed, alt: Title }, event: { load: $root.imageLoadHandler }" />
我的 viewModel 中的搜索功能:这将返回 json 结果,填充我的 observable 数组,然后通过首先检查以确保 promises 数组已满来设置每个“缩略图”的高度,然后在满时获取最大高度并设置所有“缩略图”到那个高度。
self.search = function () {
$.getJSON(arguments[0].action, { name: this.searchValue() }, function (data) {
self.movies(data);
setThumbnailHeight();
});
};
var setThumbnailHeight = function() {
var $items = $('.thumbnails li');
$.when.apply($, promises).done(function() {
var maxHeight = Math.max.apply(null, $items.map(function () {
return $(this).height();
}).get());
$items.css('height', maxHeight);
});
};
我的问题是:为什么加载事件在图像加载之前触发,我怎样才能在适当的时间触发加载事件?
更新
我的想法是加载事件可能会过早触发,因为它可能是在图像具有它之后附加的src
。如果仅更改事件绑定的顺序不起作用,我可能必须创建自定义绑定。