經過JQuery的.html()函數咱們能夠很是方便地加載一段HTML到指定的元素中,例如給<div></div>中放入一組圖片。問題是JQuery的.html()函數是同步的,若是咱們想知道HTML被加載以後容器的高,例如獲取容器的offsetHeight或scrollHeight屬性的值,必需要等HTML元素中全部的內容都加載完畢後才能獲取到真實的值,尤爲是HTML中包含有image標籤時。那如何才能實現.html()函數的回調方法呢?答案是使用前端的Q.html
對應的代碼以下:前端
var defer = Q.defer(); var realHtml = $('#html-canvas'); realHtml.html(html); var contentImages = $("#html-canvas img"); var totalImages = contentImages.length; var loadedImages = 0; if (contentImages.length === 0) defer.resolve(); else { contentImages.each(function(){ $(this).on('load', function(){ loadedImages++; if(loadedImages == totalImages) { defer.resolve(); } }); }); } return defer.promise.then(function () { console.log('all done.'); });
首選經過JQuery選擇器找到容易中已加入HTML的全部img元素,而後給全部img元素添加onLoad事件,並判斷是否全部img元素的onLoad事件是否都已經觸發(loadedImages == totalImages)。而後經過defer.resolve()來通知Q的promise已完成異步操做,而後在.then()函數中就能夠繼續下一步操做了。git