Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.10.2014, 15:12
Аспирант
Отправить личное сообщение для tourniquet Посмотреть профиль Найти все сообщения от tourniquet
 
Регистрация: 04.04.2014
Сообщений: 58

Так как же работает onload?
День добрый! В каком-то смысле, я разобрался, но не до конца. Проблема в том что есть скрипт, который работает по разному если ставить его в head или в конце, на ряд выше закрывающего тега body. Но почему это происходит по разному если и там и там я использую window.onload? Читаю про это, и вижу: "Обработчик window.onload срабатывает, когда загружается вся страница, включая ресурсы на ней — стили, картинки, ифреймы и т.п.", значит, как я понимаю, скрипт должен заработать только после того как страничка уже загружена полностью, но не тут то было! Привожу пример:

JS код:

window.onload = touchRock();

function touchRock() {
	var userName = prompt("What is your name?", "Insert your name.");

	if (userName) {
		alert("Glad to see you, " + userName);
		document.getElementById('rockImg').src = 'img/rock_happy.gif';
	}
}


и рабочий вариант:

<!doctype html>
<html>
	<head>
		<title>iRock - Виртуальный любимец Rock</title>
		<meta charset="utf-8">
		<link rel="stylesheet" type="text/css" media="screen" href="style.css">

	</head>
	<body>
		<div class="rock">
			<img id="rockImg" src="img/rock.gif" alt="iRock" style="cursor:pointer" />
		</div>
		<script src="js/someAlert.js"></script>
	</body>
</html>


а вот и вариант который выдаёт мне ошибку "Cannot set property 'src' of null":

<!doctype html>
<html>
	<head>
		<title>iRock - Виртуальный любимец Rock</title>
		<meta charset="utf-8">
		<link rel="stylesheet" type="text/css" media="screen" href="style.css">
		<script src="js/someAlert.js"></script>
	</head>
	<body>
		<div class="rock">
			<img id="rockImg" src="img/rock.gif" alt="iRock" style="cursor:pointer" />
		</div>
	</body>
</html>


Хорошо, ошибка есть, но, тогда интересный вопрос, почему с prompt и alert-ом всё нормально?
Ответить с цитированием
  #2 (permalink)  
Старый 22.10.2014, 15:25
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от tourniquet
Читаю про это, и вижу: "Обработчик window.onload срабатывает, когда загружается вся страница, включая ресурсы на ней — стили, картинки, ифреймы и т.п.", значит, как я понимаю, скрипт должен заработать только после того как страничка уже загружена полностью, но не тут то было! Привожу пример
Так в твоем примере нет события onload как такового...

Просто есть корявая попытка присвоить этому обработчику значения, которое вернет функция
Сообщение от tourniquet
window.onload = touchRock();
Но поскольку функция та вообще ничего не возвращает - значит и обработчика никакого нет.

Правильный вариант использования
window.onload = touchRock;
Ответить с цитированием
  #3 (permalink)  
Старый 22.10.2014, 15:38
Аспирант
Отправить личное сообщение для tourniquet Посмотреть профиль Найти все сообщения от tourniquet
 
Регистрация: 04.04.2014
Сообщений: 58

Хм, да, работает. Иду читать про правильный вызов функции. Спасибо!
Ответить с цитированием
  #4 (permalink)  
Старый 22.10.2014, 15:39
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от tourniquet
Иду читать про правильный вызов функции.
Про события читай...
http://javascript.ru/tutorial/events/intro
Ответить с цитированием
  #5 (permalink)  
Старый 22.10.2014, 16:01
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от ksa
Так в твоем примере нет события onload как такового
Ну зачем так ) Расстроил беднягу. Он ведь верил в это. Верил что навесил обработчик onload. Может он жил верой, а? А ты его веру разрушил ))
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 22.10.2014, 17:25
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от ksa
Про события читай...
Не дочитает. ТС, тут читайте: вы должны или передать текст функции в свойство onload, или _ссылку_ на нее. Текст:

window.onload=function(){alert('Me loaded!')};

Нормально это называется closure:

var me_loaded=function() {alert('Me loaded!')}

Не видите разницы? Ее и нет.

А ссылка это имя функции, ее идентификатор, ключ в массиве проранства имен JS.

window.onload = me_loaded; // это ссылка

А если window.onload=me_loaded(); // тут функция просто выполнится сразу же, как только интерпретатор докатится до этой строки и вы получите алерт без всякой связи с событием.
Ответить с цитированием
  #7 (permalink)  
Старый 25.10.2014, 00:06
Аспирант
Отправить личное сообщение для tourniquet Посмотреть профиль Найти все сообщения от tourniquet
 
Регистрация: 04.04.2014
Сообщений: 58

http://repl.it/2TM хрен его знает у кого больше проблем с головой, то ли у меня, то ли с JS не всё в порядке, но какого юха первый вариант возвращает херню, при том что 3 функция, работает вроде по тому же принципу, и возвращает то что надо?
Ответить с цитированием
  #8 (permalink)  
Старый 25.10.2014, 12:29
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Вот так надо

return ++num;
Ответить с цитированием
  #9 (permalink)  
Старый 25.10.2014, 19:31
Аспирант
Отправить личное сообщение для tourniquet Посмотреть профиль Найти все сообщения от tourniquet
 
Регистрация: 04.04.2014
Сообщений: 58

Ёклмн! Я забыл про постфикс и префикс! Виноват, каюсь!
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так чтобы ajax возвращал результат? Rooner AJAX и COMET 7 28.06.2013 12:42
Как отследить onload в iframe в ie8 platedz Events/DOM/Window 15 12.06.2013 03:20
не работает скрипт как ссылка Abraham jQuery 31 14.06.2011 03:04
Как заставить работать событие onLoad для embed slim-v Events/DOM/Window 0 16.09.2010 15:07
Mozilla, не работает onLoad Zeal Firefox/Mozilla 3 18.09.2008 17:52