Javascript.RU

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

Видимость переменной про onLoad
Я только начал заниматься яваскриптом, поэтому вопрос может быть глупый. Вот код
var desc;
var img = new Image();
img.onload = function(){
var desc = true;
}
img.onerror = function(){
var desc = false;
}
img.src = '1.jpg';
alert(desc);

Почему переменной desc не передаются значения? выводит undefined.
Я догадываюсь что все дело в области видимости, но как это реализовать не знаю
Ответить с цитированием
  #2 (permalink)  
Старый 02.11.2011, 16:54
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,122

Сообщение от Jambo85
Вот код
Это таки огрызок кода...

Но даже в нём видно что переменная desc не имеет значения (т.е. не определена)...
Правда есть две функции в которых объявлены свои переменые desc. И если даже вызвать эти функции на исполнение (чего нет), это картину не изменит.

Сообщение от Jambo85
Я догадываюсь что все дело в области видимости
Пока до этого даже дело не дошло...

Сообщение от Jambo85
но как это реализовать не знаю
Реализовать что?
Ответить с цитированием
  #3 (permalink)  
Старый 02.11.2011, 17:10
Новичок на форуме
Отправить личное сообщение для Jambo85 Посмотреть профиль Найти все сообщения от Jambo85
 
Регистрация: 02.11.2011
Сообщений: 4

Попробую по другому объяснить - необходимо предварительно проверить наличие картинки, в зависимости от результата(есть или нет) формируется строка т.е при наличии картинки на сервере выводится текст + сама картинка, если картинки нет то только текст.
Так вот данный "огрызок" кода призван проверять факт наличия изображения на сервер и выдавать результат в виде desc.
Выглядит так:
var desc;
var img = new Image();
img.onload = function(){
var desc = true;
}
img.onerror = function(){
var desc = false;
}
img.src = '1.jpg';

if (desc)
 { .... }
else { .... }

Пробовал так 
var desc;
var img = new Image();
img.onload = function(){
 desc = true;
}
img.onerror = function(){
 desc = false;
}
img.src = '1.jpg';

if (desc)
 { .... }
else { .... }

Результат тот же.
Так же заметил что в теле функций onload и onerror значение desc присваивается, но за ними desc undefined
Не ругайте, постарался изложить как мог

Последний раз редактировалось Jambo85, 02.11.2011 в 17:37.
Ответить с цитированием
  #4 (permalink)  
Старый 02.11.2011, 19:57
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,122

Сообщение от Jambo85
Так же заметил что в теле функций onload и onerror значение desc присваивается, но за ними desc undefined
Что-то написать в функции не значит что это исполнилось...

Попробую объяснить...
Вот это из области видимости переменных

var test=1;
go(2);
alert(test);
set(3);
alert(test);

function go(N) {
   var test=N;
};
function set(N) {
   window.test=N;
};
Ответить с цитированием
  #5 (permalink)  
Старый 02.11.2011, 20:00
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,122

А это твой вариант...

var test=1;
var a=function go() {
   var test=2;
};
alert(test);
var b=function set() {
   window.test=3;
};
alert(test);


Разницу видишь?
Ответить с цитированием
  #6 (permalink)  
Старый 02.11.2011, 20:03
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,122

Всё это я к чему... К тому, что язык выполняет последовательность команд как "понимает" их он. А не так, как их понимаешь ты.
Ответить с цитированием
  #7 (permalink)  
Старый 04.11.2011, 16:01
Новичок на форуме
Отправить личное сообщение для Jambo85 Посмотреть профиль Найти все сообщения от Jambo85
 
Регистрация: 02.11.2011
Сообщений: 4

Спасибо за помощь, только разница в том что
var a=function go() {
var test=2;
};

В примере не выполняется пока ее не вызовешь, а в моем случае
img.onload = function(){
desc = true;
}

onload выполнит действие desc=true.
Вообщем так и не понял как в с помощью этой функции изменять значения переменной, видимо onload/onerror выполняются в каком то отдельном контексте.
Ответить с цитированием
  #8 (permalink)  
Старый 04.11.2011, 17:21
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,122

Сообщение от Jambo85 Посмотреть сообщение
в моем случае
img.onload = function(){
desc = true;
}

onload выполнит действие desc=true
В твоём примере она не выполняется. Именно это я и пытался тебе проиллюстрировать своим примером, который ты понял таки правильно.
А вот свой так и не понял... Показываю еще раз, т.с. максимально приблизив к боевым.

var desc; 
 var img = new Image();
 img.onload = function(){
    //var desc = true; 
    alert(1)
 }
 img.onerror = function(){
    //var desc = false; 
    alert(2)
 }
 img.src = 'http://javascript.ru/forum/images/smilies/smile.gif'; 
 ///alert(desc);


Хотя нет. Не прав тут я...
Тогда вот тебе нужный вариант.

window.desc=0; 
 var img = new Image();
 img.onload = function(){
    window.desc = true; 
 }
 img.onerror = function(){
    window.desc = false; 
 }
 img.src = 'http://javascript.ru/forum/images/smilies/smile.gif'; 
 setTimeout(function(){alert(window.desc);},200);


Т.е. onload не выполняется мгновенно... Ему ведь нужно дождаться когда картинка загрузится. Только тогда и наступает это событие.

Последний раз редактировалось ksa, 04.11.2011 в 17:26.
Ответить с цитированием
  #9 (permalink)  
Старый 05.11.2011, 08:01
Новичок на форуме
Отправить личное сообщение для Jambo85 Посмотреть профиль Найти все сообщения от Jambo85
 
Регистрация: 02.11.2011
Сообщений: 4

Во спасибо, как раз то что было нужно
Ответить с цитированием
  #10 (permalink)  
Старый 05.11.2011, 09:21
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от ksa
setTimeout(function(){alert(window.desc);},200);
Откуда уверенность, что картинка за 200 мс успеет загрузиться?
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вернуть имя переменной Йакуд Общие вопросы Javascript 21 18.05.2014 10:10
Создание переменной по значению другой переменной bahek2462774 Общие вопросы Javascript 2 09.10.2011 10:11
вопрос про создание переменной Gamestop Общие вопросы Javascript 2 04.09.2011 21:48
Видимость еременных. Объявление и присваивание. DonLino jQuery 9 12.08.2010 12:44
Переменная от переменной или как к имени переменной конкатенировать значение другой Aderba jQuery 5 12.11.2008 15:25