I allow the user to insert an object, an image, and then I call a function on that object. What seems random to me, sometimes it works, and sometimes not, I believe that this is due to the fact that the DOM is not updated?
//add a new image function add_image(img) { var objCount = count_objects() + 1; var objId = 'object_'+objCount; var myNewImg = jQuery('<div/>', { id: objId, class: 'object_image invisible', }).appendTo('#objectbox'); //sätt objektnamnet (användaren kan ändra senare) $('#'+objId).attr('namn', objId) //sätt låsta proportioner som standard $('#'+objId).addClass('lockedAspectRatio') //lägg till bilden i detta element var imgInner = jQuery('<img/>', { id: objId, class: 'object_image_inner', src: img, }).appendTo( '#'+objId ); window.objectCounter++; prepare_editmode(); //reset the flag and the temporary image field now that image adding is complete $('#imageGhost').val(null); //fixa rätt storlek på bilden setTimeout(function(){ restoreSize(myNewImg,imgInner); $(myNewImg).removeClass('invisible'); }, 1500); }
Because if I manually start this last function with a button after a second or so, it always works.
function restoreSize(myImg,imgInside) { if (imgInside == null) { console.log("nothing passed"); var imgInside = $(myImg).find('img'); } else { console.log("passed alright"); } //remove fixed dimensions on containing div $(myImg).css("height", 'auto' ); $(myImg).css("width", 'auto' ); //remove the 100% attribute on the image $(imgInside).css("width", 'auto' ); $(imgInside).css("height", 'auto' ); //get calculated dimensions of div once img original size determines it var newWidth = $(myImg).css("width"); var newHeight = $(myImg).css("height"); //...and set them firmly. $(myImg).css("width", newWidth ); $(myImg).css("height", newHeight ); //restore the height/width 100% property to image in case of new resize $(imgInside).css("width", '100%' ); $(imgInside).css("height", '100%' ); }
I try to set the timeout to zero with the same result - sometimes the image is loaded, and sometimes not so that it works randomly, with large images (with a long download time in the browser), of course, it fails more often. Right now I went around it with a timeout in seconds, but this is not a very pretty solution: - / maybe I could put a loop in find ('img') that continues to scan the image only after it is detected? But can this run into the problem of an infinite loop several times?