Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.11.2011, 18:05
Новичок на форуме
Отправить личное сообщение для Dravig Посмотреть профиль Найти все сообщения от Dravig
 
Регистрация: 15.11.2011
Сообщений: 4

Пауза в Javascript (new)
Столкнулся с проблемой, описанной здесь:Пауза в JS

У меня есть скрипт, который загружает изображения по заданным параметрам. В нем есть функция, которая должна проверять, существует ли это изображение или нет, если нет, грузить прозрачку.
function onImageExistError(url)
			
              {		  
                  var testImage=new Image(); 
	     testImage.src=url;
	     //alert("УРА ТОВАРИЩИ")			
                  if (testImage.width > 0 )		 			
                  { 			
                    return url;
                  }
                  else
                  {
                    return "false.png";
                  }
              }

Проблема в том что, программа не успевает проанализировать весь массив изображений и выдает их рандомно какие успевает. А если поставить alert перед циклом, то все работает как надо.
Как мне заставить скрипт выполняться правильно без алерта?
Ответить с цитированием
  #2 (permalink)  
Старый 15.11.2011, 18:09
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

Судя по всему на момент начала работы функции далеко не все картинки загружены. Рекомедую обрабатывать нативное событие onerror у изображения, которое и возникает если оное не загружено.
<img src="нету такой картинки =(" onerror="src='http://javascript.ru/forum/images/ca_serenity/misc/logo.gif'">
__________________
29375, 35

Последний раз редактировалось Aetae, 15.11.2011 в 18:15.
Ответить с цитированием
  #3 (permalink)  
Старый 15.11.2011, 18:26
Новичок на форуме
Отправить личное сообщение для Dravig Посмотреть профиль Найти все сообщения от Dravig
 
Регистрация: 15.11.2011
Сообщений: 4

Тут все сложнее: Это окно google maps, на которое накладываются поверх нужные изображения. Их url генерируется автоматически, в зависимости от зума и местоположения карты. Это обеспечивает другая js-функция. Т. е на момент начала работы onImageExistError не загружено ничего.
Ответить с цитированием
  #4 (permalink)  
Старый 15.11.2011, 18:45
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

И?
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 16.11.2011, 11:30
Новичок на форуме
Отправить личное сообщение для Dravig Посмотреть профиль Найти все сообщения от Dravig
 
Регистрация: 15.11.2011
Сообщений: 4

Т. е. изображения грузятся не в виде img, а в виде элемента той самой гугл-карты (TMS). Куда в этом случае запихнуть onerror - я не представляю...
Ответить с цитированием
  #6 (permalink)  
Старый 16.11.2011, 20:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

С этим дело не имел, потому хз как там все работает. Скорей всего для этого есть свои методы.
Я так понял вы отдаёте список ссылок на изображения, а там уже они как то обрабатываются? Может дадите пример кода или линк?

А так проверить картинки на существования можно аяксом, если они на вашем сервере.
__________________
29375, 35

Последний раз редактировалось Aetae, 16.11.2011 в 20:55.
Ответить с цитированием
  #7 (permalink)  
Старый 18.11.2011, 12:21
Новичок на форуме
Отправить личное сообщение для Dravig Посмотреть профиль Найти все сообщения от Dravig
 
Регистрация: 15.11.2011
Сообщений: 4

Вот так загружаются те самые картинки. Тут есть свойство 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 призвана это отслеживать. Однако, она не успевает это сделать для всех тайлов и тоже грузит их как попало.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
javascript вставки в vrml сцены. Передать событие из броузера Proletariy Javascript под браузер 0 10.05.2011 12:26
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
JavaScript на Яндекс.Фотки - почему тормозит браузеры? ZavFirefox Javascript под браузер 23 27.09.2009 19:24