Пауза в Javascript (new)
Столкнулся с проблемой, описанной здесь:http://javascript.ru/forum/misc/3123-pauza-v-js.html
У меня есть скрипт, который загружает изображения по заданным параметрам. В нем есть функция, которая должна проверять, существует ли это изображение или нет, если нет, грузить прозрачку. function onImageExistError(url) { var testImage=new Image(); testImage.src=url; //alert("УРА ТОВАРИЩИ") if (testImage.width > 0 ) { return url; } else { return "false.png"; } } Проблема в том что, программа не успевает проанализировать весь массив изображений и выдает их рандомно какие успевает. А если поставить alert перед циклом, то все работает как надо. Как мне заставить скрипт выполняться правильно без алерта? |
Судя по всему на момент начала работы функции далеко не все картинки загружены. Рекомедую обрабатывать нативное событие onerror у изображения, которое и возникает если оное не загружено.
<img src="нету такой картинки =(" onerror="src='http://javascript.ru/forum/images/ca_serenity/misc/logo.gif'"> |
Тут все сложнее: Это окно google maps, на которое накладываются поверх нужные изображения. Их url генерируется автоматически, в зависимости от зума и местоположения карты. Это обеспечивает другая js-функция. Т. е на момент начала работы onImageExistError не загружено ничего.
|
И?
|
Т. е. изображения грузятся не в виде img, а в виде элемента той самой гугл-карты (TMS). Куда в этом случае запихнуть onerror - я не представляю...
|
С этим дело не имел, потому хз как там все работает. Скорей всего для этого есть свои методы.
Я так понял вы отдаёте список ссылок на изображения, а там уже они как то обрабатываются? Может дадите пример кода или линк? А так проверить картинки на существования можно аяксом, если они на вашем сервере. |
Вот так загружаются те самые картинки. Тут есть свойство getURL, которое определяется функцией.
var tmsoverlay = new OpenLayers.Layer.TMS( "TMS Overlay", "", { type: 'png', [B]getURL: overlay_getTileURL,[/B] alpha: true, isBaseLayer: false, displayInLayerSwitcher: true, visibility: true }); map.addLayer(tmsoverlay); Вот так выглядит функция overlay_getTileURL: function overlay_getTileURL(bounds) { var res = this.map.getResolution(); var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w)); var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tileSize.h)); var z = this.map.getZoom(); if (mapBounds.intersectsBounds( bounds ) && z >= 4 && z <= 7 ) { imageSrc = "file:///C:/Work/GIS_GMS/TMS/111301_new/" + z + "/" + x + "/" + y + "." + this.type; imageSrc1 = onImageExistError(imageSrc); return imageSrc1; }else if (mapBounds.intersectsBounds( bounds ) && z >= 8 && z <= 11) { imageSrc = "file:///C:/Work/GIS_GMS/TMS/12309_rgb/" + z + "/" + x + "/" + y + "." + this.type; imageSrc1=onImageExistError(imageSrc); return imageSrc1; }else { return "http://www.maptiler.org/img/none.png"; } } bounds - границы видимого участка карты z - зум x и у - координаты. Причем картинки расфасованы по папкам согласно зуму и координатам. Таким образом, грузится только то, что попадает на видимую часть карты. Причем охват двух разных наборов тайлов - разный. И если открыть участок гугловской карты там, где этих тайлов нет, то программа генерирует ссылку и пытается найти несуществующие изображения, не находит, и грузит что попало. Функция onImageExistError призвана это отслеживать. Однако, она не успевает это сделать для всех тайлов и тоже грузит их как попало. |
Часовой пояс GMT +3, время: 00:54. |