Knockout.jsを使用して、サーバーから返された検索結果のリストを表示しています。結果セットの各結果には画像が含まれています。すべての画像の最大高さに基づいて画像の親divのサイズを変更できるように、各画像のloadイベントにハンドラーをアタッチしようとしていますが、画像の読み込みが完了する前にloadイベントが発生しているようです。
さらに、Firebugでロードハンドラーがヒットしていることがわかりますが、デバッグの動作はイメージをロードする時間を与えるだけなので、デバッグ時にすべてが正しく機能します。
viewModel内のロードハンドラー:これにより、解決済みの遅延がpromise配列にプッシュされます。次に、配列がいっぱいになっていることを確認するだけで、画像が読み込まれたことがわかります。
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の結果を返し、監視可能な配列にデータを入力し、最初にpromise配列がいっぱいであることを確認して各「サムネイル」の高さを設定し、いっぱいになると最大の高さを取得して設定しますその高さまでのすべての「サムネイル」。
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);
});
};
私の質問は、画像が読み込まれる前にloadイベントが発生するのはなぜですか?また、適切なタイミングでloadイベントを発生させるにはどうすればよいですか?
アップデート
私の考えでは、ロードイベントは、イメージにアタッチされた後にアタッチされる可能性があるため、時期尚早に発生する可能性がありますsrc
。イベントバインディングの順序を変更するだけではうまくいかない場合は、カスタムバインディングを作成する必要があるかもしれません。