Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое создание image, содание tooltip с картинкой 
V
    Опции темы
Atlete
Дата 5.11.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Вот столкнулся со следующей проблемой.
Написал не сложный tooltip с картинками.
Создаю картинку, добавляю на страницу.
Все это работает. Но при создании необходимо получить размер
картинки (ширину, высоту). Если картинка больше максимального размера 
изменить ей высоту и ширину до максимальной.
Код примерно такой:
Код

var img = document.createElement('img');
img.src = addr;
//img.src = setAttribute('src',addr);
alert(img.width+':'+img.height);

Вот тут получается что высота и ширина равна нулю.
Пробовал получать ширину и высоту следующим образом:
Код

function getWidth (elem){
     return elem.offsetWidth || this.getStyle(elem,'width') || this.getStyle(elem,'min-width') || elem.width;
}

Результат тот-же.
Есть ли возможность получить реальную высоту и ширину создаваемой так картинки.

Возможно необходимо загрузить все нужные картинки в скрытом div'е например, а потом
уже при создании использовать их. Это еще не пробовал.

У кого есть еще какие мысли? Что я делаю не так?
PM MAIL ICQ   Вверх
bars80080
Дата 5.11.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 15
Всего: 315



может она ещё не загрузилась?

вообще, картинки привычнее создавать var img = new Image();
проверить состояние загрузки, вроде через img.onload = function() {}; можно
PM MAIL WWW   Вверх
Atlete
Дата 5.11.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Похоже это оно.
Я как то совсем забыл про этот метод.
Думаю теперь все будет работать правильно.

Спасибо.
PM MAIL ICQ   Вверх
IDVsbruck
Дата 5.11.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



И еще кроме как createElement или new Image надо поместить созданный элемент в ДОМ. Пока он не помещен, его визуальные стили не посмотришь.
PM MAIL   Вверх
youri
Дата 6.11.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



зато width и height посмотришь. А src лучше назначать после назначения onload

Это сообщение отредактировал(а) youri - 6.11.2009, 12:36
PM   Вверх
Atlete
Дата 6.11.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Если src назначать в onload то получается размер картинки тоже только после выполнения onload можно узнать?
Я сделал так. src назначил до onload, потом в onload уже беру все нужные параметры.
До тех пор пока картинка загружается отображаю пользователю сообщение об этом.
PM MAIL ICQ   Вверх
youri
Дата 6.11.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



Цитата(Atlete @  6.11.2009,  12:46 Найти цитируемый пост)
Если src назначать в onload то получается размер картинки тоже только после выполнения onload можно узнать?

Если src назначать в onload, то получиться бред. Ты мои сообщения по диагонали читаешь?
PM   Вверх
Atlete
Дата 6.11.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



youri прошу прощения сильно. Недосмотрел smile.

Перенес присвоение присвоения src после установления onload.
Но возникла интересная (неприятная) ситуация.
В ИЕ6 и Opeara 10 при первом выполнении функции onload вызывается и все отрабатывает как положено.
Но при повторном вызове функции onload не срабатывает.
Проверял при помощи такой строки:
Код

img.onload = function(){
      document.getElementById('testit').innerHTML = 'run';
      . . . . . . 
}


Как можно заставить нормально отрабатывать метод onload при повторном вызове функции?
Возможно что то делаю не так.
PM MAIL ICQ   Вверх
bars80080
Дата 6.11.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 15
Всего: 315



по-моему, у оперы насчёт загрузки изображений был глюк. и здесь кто-то выкладывал решение его
PM MAIL WWW   Вверх
youri
Дата 6.11.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



выложили минимальный неработающий пример. Я как раз это проверял (по идее), когда отвечал. У меня работало в любом порядке, но src логичнее назначать после onload, чтобы всегда срабатывало
PM   Вверх
Atlete
Дата 9.11.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



К сожалению не помогло даже изменения место положения присвоения src.
Вот полный код функции:
Код

function showModalImage3(addr){
    closeShowModalImage3();
    var scr_w = serv.getScreenWitdh();
    var scr_h = serv.getScreenHeight();
    var img = null;
    img = new Image();//document.createElement('img');
    var c_top = serv.getScrollTop();// get top position
    var add_delta = 0;
    var body = document.getElementsByTagName('body');
    var div = document.createElement('div');
    var div_arc = document.createElement('div');
    
    
    var imgwidth = img.width;
    var imgheight = img.height;
    
    
    if(navigator.appName=='Microsoft Internet Explorer'){
        add_delta = c_top;
    }
    div.innerHTML = '<div style="text-align:right;padding-bottom:5px;"><span onclick="closeShowModalImage3();return false;" style="cursor:pointer;">'+'<span style="color:666666;font-weight:bold;">CLOSE'+' <span style="font-size:12px;">[ X ]</span></span></div><br/><div id="waiting" style="width:300px;height:300px;text-align:center;"><image style="margin-top:100px;" src="/images/waitimage.gif"/></div>';
    div_arc.className='angle';
    div_arc.zIndex=10;
    
    div_arc.style.top=add_delta+mouseY;
    div_arc.style.left=mouseX;
    div_arc.style.position="absolute";
    
    div.style.position="absolute";
    var step_up = (imgheight>0?imgheight/4:50);
    var top = add_delta+mouseY-step_up;
    var left = mouseX+8; 
    div.zIndex=10;
    div.style.top=top;
    div.style.left=left;
    div.style.borderWidth='1px';
    div.style.borderColor='#8EAACE';
    div.style.backgroundColor="#EEF5FF";
    div.style.padding='5px';
    div.style.borderStyle='solid';
    current_screenshot=div;
    current_screenshot_close=div_arc;
    
    img.onload = function(){
        // add image after load
        document.getElementById('testit').innerHTML = 'run';
        imgwidth = img.width;
        imgheight = img.height;
        ratio = imgheight / imgwidth;
        
        if(imgwidth>800){
            img.width = 800;
            img.height = parseInt(800 * ratio);
            imgwidth = 800;
            imgheight = parseInt(800 * ratio);
        }
        
        var divimage = document.createElement('div');
        divimage.id = 'showimage';
        divimage.appendChild(img);
        $('#waiting').hide();
        div.appendChild(divimage);
    }
    
    img.src = addr;
    body[0].appendChild(div);
    body[0].appendChild(div_arc);
    window.scrollTo(0,top-10);
}


Возможно где то туплю.

P.S. не судите строго знаю что некоторые вещи сделаны топорно smile
PM MAIL ICQ   Вверх
Atlete
Дата 9.11.2009, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Проблему решил.

Первое:
Код

header("Expires: Mon, 01 Jan 2000 00:00:00 GMT");   
header("Cache-Control: no-cache, must-revalidate");  
header("Pragma: no-cache");  
header("Last-Modified: ".gmdate("d, d m y h:i:s")." GMT"); 


ну и немного подправил javascript:
было:
Код

...
$('#waiting').hide();
...

стало:
Код

...
div.innerHTML = '<div style="text-align:right;padding-bottom:5px;"><span onclick="closeShowModalImage3();return false;" style="cursor:pointer;">'+'<span style="color:666666;font-weight:bold;">CLOSE'+' <span style="font-size:12px;">[ X ]</span></span></div><br/>';
...


Возможно кому то пригодится и такая реализация.

PM MAIL ICQ   Вверх
youri
Дата 9.11.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



ты б может стили в css вынес... да и вообще, разбил бы эту функцию на меньшие (;

Цитата(Atlete @  9.11.2009,  11:19 Найти цитируемый пост)
Проблему решил

а ты что фотографии с помощью php отдаешь? И значит теперь фотографии не будут никогда кешироваться?
PM   Вверх
Atlete
Дата 9.11.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Это скриншоты. Я их не отдаю с помощью php. Они лежать в определенной папке.
Но кешироваться они не будут.
Насчет модернизации скрипта, то можно кроме выноса стилей css
еще и все остальное переделать на более правильный вид.
Возможно на досуге и оптимизирую.
Из-за кеширования и не работал метод onload.
Запретил кеширование и все заработало.
PM MAIL ICQ   Вверх
youri
Дата 10.11.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



Цитата(Atlete @  9.11.2009,  22:45 Найти цитируемый пост)
Это скриншоты. Я их не отдаю с помощью php. Они лежать в определенной папке.

Цитата(Atlete @  9.11.2009,  11:19 Найти цитируемый пост)
header("Expires: Mon, 01 Jan 2000 00:00:00 GMT");   header("Cache-Control: no-cache, must-revalidate");  header("Pragma: no-cache");  header("Last-Modified: ".gmdate("d, d m y h:i:s")." GMT"); 

а (: т.е. ты добавил заголовки к основной страничке и думаешь, что фотографии кэшироваться не будут? Тогда это решение очень похоже на "Переставил компьютер в другую комнату. Всем спасибо. Тему можно закрывать".

Цитата(Atlete @  9.11.2009,  22:45 Найти цитируемый пост)
Но кешироваться они не будут.

за счет чего?

Цитата(Atlete @  9.11.2009,  22:45 Найти цитируемый пост)
Из-за кеширования и не работал метод onload.Запретил кеширование и все заработало.

У меня все работает и в ie6 и в opera 10, при том что фотографии достаются из кэша. Попробуй простейшую страничку
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<body>
<script type="text/javascript">
var img = new Image();
img.onload = function() {
    alert(1);
}
img.src = 'blank.gif';
</script>
</body>
</html>

и скажи, какие заголовки возвращает сервер
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0760 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.