Хорошо, в вашем вопросе есть много частей, я начал делать простейшую вещь, регистрируя проанализированный XML-документ, и выглядит так:
...
<IMAGE url="...."></IMAGE>
<IMAGESIZE></IMAGESIZE>
...
Итак, в вашем скрипте вы получаете атрибут, который несуществовать.Таким образом, вы можете безопасно удалить эту строку:
var imageSize = elem.getElementsByTagName("IMAGE").length === 0 ? "..." : elem.getElementsByTagName("IMAGE")[0].width + 'x' + [0].height;
Далее вам нужно проверить, загружены ли изображения, самое простое, что нужно сделать:
"<img src=" + imageURL + ' height="150" width="100" onload="this._loaded = true;">' +
, это добавит проприетарный _loaded
свойство к нему.
Далее вам нужно проверить, когда изображения загружаются и после загрузки запускают функцию, вам нужна рекурсивная функция, которая делает то, что не удаляет стек:
var imgTags = document.getElementsByTagName('img');
function isLoaded(){
if(Array.prototype.slice.call(imgTags).some(function(d,i){return !d._loaded})){
setTimeout(isLoaded,4);
} else {
$('#myTable textTag').each(function(i,node) {
node.textContent = imgTags[i].naturalWidth + 'x' + imgTags[i].naturalHeight;
//console.log(image_width + 'x' + image_height);
});
}
};
isLoaded();
Я удалил бит querySelectorAll(img)
, он медленнее по сравнению с getElementsByTagName
и не возвращает LIVE HTML Collection
, возвращает NodeList
.Загруженная функция запустит ваш Jquery, как только обнаружит все свойства _loaded
.Array.prototype.slice.call
- это старомодный способ преобразования HTML Collection
или NodeList
в обычный массив, крутые дети, которых вы Array.from
в наше время, решать только вам.Вы также можете немного оптимизировать вышеупомянутую функцию, сохраняя результат Array.prototype.slice.call...
один раз, я оставляю это вам.В целом это выглядит так:
https://jsfiddle.net/ibowankenobi/h9evc81a/