Использование события onload может быть проблематично, т. Е. В некоторых случаях - см. Комментарии здесь: http://msdn.microsoft.com/en-us/library/cc197055(v=vs.85).aspx - даже если изображение создано в коде, если оно уже кэшировано, оно может не сработать. Это может относиться только к IE6-7.
Таким образом, в дополнение к этому вы должны сначала проверить, закончилась ли загрузка, а затем связать событие, используя свойства naturalWidth
и complete
(для старого IE). naturalWidth
(и высота) будут неопределенными, пока изображение не загрузится.
Я могу представить себе состояние гонки, если сначала проверишь, загружен ли он, а затем, если нет, свяжет событие «onload», но между этими двумя действиями изображение завершает загрузку. Я не уверен, возможно ли это, учитывая однопоточный характер JS, но поскольку изображения загружаются асинхронно, возможно, это так.
В проекте, где у меня была похожая проблема, я просто проверял, было ли загружено изображение или нет, и, если нет, устанавливал тайм-аут для повторного вызова функции, поэтому он продолжал бы пытаться, пока не загрузится. Это позволит избежать любого возможного состояния гонки.