Javascript.RU

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

Свойство width картинки равно 0px
Привет всем!
Возникла проблема с самописной галереей, в общих чертах обрисую её так:
<div id='b'>
	<img id='fullimage' src='' onclick='f()'>
</div>
<script>
var b = document.getElementById('b');
var im = document.getElementById('fullimage');
im.setAttribute('src', 'адрес_картинки');
alert(getComputedStyle(im).width); //почему 0? Не пойму, на каком этапе будет видна ширина картинки? Я же вроде уже прописал источник, откуда будет тянуться картинка...
function f() {
	alert(getComputedStyle(im).width); //вот здесь уже корректная ширина
}
</script>

Также хочу спросить: возможно ли сделать так, чтобы высота отображалась сразу?
Ответить с цитированием
  #2 (permalink)  
Старый 11.10.2014, 04:40
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Boolean_Type
Не пойму, на каком этапе будет видна ширина картинки? Я же вроде уже прописал источник, откуда будет тянуться картинка
То есть картинка по-твоему успевает скачаться с сервера быстрее, чем твой процессор перейдет к выполнению следующей инструкции кода? Ты действительно в это веришь?

Жди события @load на картинке. Но перед этим проверь свойство .complete картинки. Если картинка есть в кэше, то оно равно true, и события @load не будет (по-моему в некоторых браузерах будет, но это неважно)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 11.10.2014, 19:38
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Я тоже сначала думал что за бред - сначала грузим картинку в пустой объект, потом из него src пихаем в другой src и, типа, железобетонно у нас есть такая картинка в кеше и можно уже продолжать.

Оказалось что без этого пустого объекта код превращается из event-driven, в хзч.

Так что грузите в пустой объект, и работайте с load, на все .complete совершенно кладите. От так-то.
Ответить с цитированием
  #4 (permalink)  
Старый 11.10.2014, 19:48
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

/* пустой объект, событие load которого сработает всегда, в любом даже самом хитрожопом браузере типа Хрома */
  var img=new Image(); 
  /* запрограммировать событие загрузки надо до впаривания src */
  img.onload=function(){
   /* внутри кложи this - это оно само, загруженная картинка */
    im.src=this.src; /* теперь можно профыкать в src элемента */
   /*  у этого объекта нет еще стилей, 
     но зато есть нормальные height, width */
    alert(this.width); // тут все понятно
  };
  /* с этого момента браузер кОчает картинку в пустой объект */
  im.src='адрес_картинки';


В принципе из этого объекта можно сделать элемент. Если вы пользуетесь стилями канонично, то можно просто заменять тот элемент - на этот элемент, а не переписывать src.
Ответить с цитированием
  #5 (permalink)  
Старый 11.10.2014, 22:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

на всякий случай
Сообщение от kostyanet
img.src='адрес_картинки';
Ответить с цитированием
  #6 (permalink)  
Старый 11.10.2014, 23:02
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Ну да, а то получится те же яйца вид снизу.
Ответить с цитированием
  #7 (permalink)  
Старый 12.10.2014, 00:23
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Сообщение от kostyanet Посмотреть сообщение
/* пустой объект, событие load которого сработает всегда, в любом даже самом хитрожопом браузере типа Хрома */
  var img=new Image(); 
  /* запрограммировать событие загрузки надо до впаривания src */
  img.onload=function(){
   /* внутри кложи this - это оно само, загруженная картинка */
    im.src=this.src; /* теперь можно профыкать в src элемента */
   /*  у этого объекта нет еще стилей, 
     но зато есть нормальные height, width */
    alert(this.width); // тут все понятно
  };
  /* с этого момента браузер кОчает картинку в пустой объект */
  im.src='адрес_картинки';
Спасибо, работает! Вот только можете мне объяснить, за счёт чего? Не пойму, в чём тут колдунство:
im.src=this.src;
и почему запрограммировать событие загрузки надо до впаривания src. Объсните, пожалуйста, нубу)

Ещё интересный момент, забыл упомянуть в 1ом посте:
var b = document.getElementById('b');
var im = document.getElementById('fullimage');
im.setAttribute('src', '1.jpg');
console.log(getComputedStyle(im)); //в консоли уже прописано св-во width, причём корректно! Т.е., getComputedStyle() уже вернула коллекцию CSS-стилей!
alert(getComputedStyle(im).width); //но здесь же 0px. Какого рожна?)
Ответить с цитированием
  #8 (permalink)  
Старый 12.10.2014, 05:54
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Boolean_Type
и почему запрограммировать событие загрузки надо до впаривания src.
Ну потому что картинка может быть в кеше и фактически окажется загруженной раньше чем вы в следующей строке забьете в колбэк свой кол. Против чего и создается новый объект, чтоб не проверять .complete. Если вы точно уверены что она всегда будет качаться с сервера - можно и после. Но какой в этом идеологический смысл?
Ответить с цитированием
  #9 (permalink)  
Старый 12.10.2014, 06:04
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Boolean_Type
Не пойму, в чём тут колдунство:
На таких скриптах как VB вы просто будете ждать когда загрузится, в это время ничего работать не будет, все встанет колом. JS устроен иначе. Загрузка выполняется браузером, а скрипт в это время уже убежал далеко-далеко, или вообще скончался. А если он скончался к тому времени когда картинка загрузилась - как ее принять на баланс, провести учет пикселов, положить на полку? Вот - в специальную проперть объекта пишется _свой_ скрипт, кусочек кода который и выполнится по _факту_ отгрузки картинки, причем выполнится в том контексте, в котором был создан. То есть все доступные ему переменные будут доступны.

Как мог популярно изложил принцип callback'ов. Что такое callback вообще, в миру? Это обратный звонок. Вы звоните в контору, выбираете в голосовом меню сделать callback, ваш номер запоминается. Сотрудник в будущем откроет список и наберет вам. Еще колбэки юзали в модемную эпоху когда связь в направлении клиент-сервер оказывалась хуже чем в направлении сервер-клиент из-за коллизий на АТС.
Ответить с цитированием
  #10 (permalink)  
Старый 12.10.2014, 06:06
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Что касается стилей - в новом объекте их нет, а после смены src наверно слетают. Не надо думать про стили как источник информации - они оформление.

Еще про асинхронность пример. Как например в VB обработать картинку загрузка которой окажется в будущем? Типа вот так

While Image.src = Null
' do nothing
End While

ну вот, прога ничего не будет делать пока нул

Как происходит чтение файлов, допустим (ts = TextStream Object)

Dim text as String

text = ts.ReadAll() ' в это время ничего не происходит, программа занята чтением файла.

На десктопе это нормально и ожидаемо, на десктопе запускаются новые thread чтобы программа работала в то время как какой-то тред занят, или вообще завис.

Но веб это же сеть. Если на вебе так делать - у вас страница будет загружаться картинка за картинкой, текст за текстом, то есть прогрессивно - один за другим. Если какой-то ресурс не загрузится - вся очередь встанет намертво. В то время как технология TCP IP позволяет передавать сразу десяток картинок и кучу текста.

Конечно, сервер он как бы десктопное приложение. Вы запросили ресурс - он по схеме открывает с десяток тредов и каждый щарашит свою часть, асинхронно то есть, как попало. Браузер все в кучу собирает по событиям загрузки кусков.

Последний раз редактировалось kostyanet, 12.10.2014 в 06:27.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
10 плавающих уровней Kvark jQuery 8 08.05.2013 16:09
Скрипт выпадающего меню vadimon Элементы интерфейса 3 12.09.2012 23:06
Скрипт, при наведении на ссылку открывает 4 картинки Игорек Элементы интерфейса 7 01.09.2012 22:01
Работа с объектом style (CSSStyleDeclaration) Skipp Events/DOM/Window 10 22.05.2010 11:49
iframe в .js TIIIMOXAN Элементы интерфейса 1 13.05.2010 13:33