Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.07.2012, 15:47
Аватар для Irish.Tippler
Новичок на форуме
Отправить личное сообщение для Irish.Tippler Посмотреть профиль Найти все сообщения от Irish.Tippler
 
Регистрация: 23.07.2012
Сообщений: 9

Помогите с присваиванием стиля в цикле.
Добрый день. Помогите пожалуйста со следующей проблемой.
Присваиваю значение onclick для элементов, с помощью цикла:
newElement.onclick = function () {this.style.backgroundImage = 'url(./img/'+this.num+'.png)';}

Тут вопросов никаких нет, но, если я хочу сделать таким образом:
newElement.onclick = function () {this.style.backgroundImage = 'url(./img/'+this.num+'.png)';
					setTimeout(function () {this.style.backgroundImage = 'none';}, 1500);}

Выдаёт мне "Cannot set property 'backgroundImage' of undefined".

В чём соль? Почему функция таймаута убирает указатель с текущего элемента?
Ответить с цитированием
  #2 (permalink)  
Старый 23.07.2012, 15:55
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

может так прокатит
newElement.onclick = function () {this.style.backgroundImage = 'url(./img/'+this.num+'.png)';setTimeout(function () {newElement.style.backgroundImage = 'none'}, 1500)}
Ответить с цитированием
  #3 (permalink)  
Старый 23.07.2012, 16:00
Аватар для Irish.Tippler
Новичок на форуме
Отправить личное сообщение для Irish.Tippler Посмотреть профиль Найти все сообщения от Irish.Tippler
 
Регистрация: 23.07.2012
Сообщений: 9

Прокатило бы, если бы такой элемент был у меня один, а то:
function draw_boxes (array, count)	{
		for (k=0; k<count; k++) {

	    var parent = document.getElementById('container');
	    var newElement= document.createElement('div');
            newElement.className = 'box_element';
	    newElement.id = k;
	    newElement.num = array[k];
	    newElement.onmouseover = function () {this.style.backgroundColor=('blue');};
	    newElement.onmouseout = function () {this.style.backgroundColor=('red');};
            newElement.onclick = function () {this.style.backgroundImage = 'url(./img/'+this.num+'.png)';
					setTimeout(function () {newElement.style.backgroundImage = 'none';}, 1500);}
	        var text = array[k];
	        var textNode = document.createTextNode(k);
	        newElement.appendChild(textNode);
	        parent.appendChild(newElement);
		                    }}


Я сделал бы обращение по Id (элементы ведь формируются в цикле), но почему-то именно в этом случае - не работает. И функция получается висеть только на последнем элементе.

Последний раз редактировалось Irish.Tippler, 23.07.2012 в 16:09.
Ответить с цитированием
  #4 (permalink)  
Старый 23.07.2012, 16:31
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Irish.Tippler,
вот так катит?
newElement.onclick = function () {th = this; this.style.backgroundImage = 'url(' + this.num + ')';
                    setTimeout(function () {th.style.backgroundImage = 'none';}, 1500);}
Ответить с цитированием
  #5 (permalink)  
Старый 23.07.2012, 16:37
Аватар для Irish.Tippler
Новичок на форуме
Отправить личное сообщение для Irish.Tippler Посмотреть профиль Найти все сообщения от Irish.Tippler
 
Регистрация: 23.07.2012
Сообщений: 9

Сообщение от Dim@ Посмотреть сообщение
Irish.Tippler,
вот так катит?
newElement.onclick = function () {th = this; this.style.backgroundImage = 'url(' + this.num + ')';
                    setTimeout(function () {th.style.backgroundImage = 'none';}, 1500);}
Катит, не совсем так, как нужно, но ответ получен, спасибо ). Надо распаралеливать таймеры элементов, видимо. Почему интересно работает через присваивание?
Ответить с цитированием
  #6 (permalink)  
Старый 23.07.2012, 16:40
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Сообщение от Irish.Tippler Посмотреть сообщение
интересно работает через присваивание?
вы про
th = this;
если да, то в переменную th записывается ссылка на объект this (newElement) который передается в setTimeout и в каждом onclick-е эта переменная своя
Ответить с цитированием
  #7 (permalink)  
Старый 23.07.2012, 16:51
Аватар для Irish.Tippler
Новичок на форуме
Отправить личное сообщение для Irish.Tippler Посмотреть профиль Найти все сообщения от Irish.Tippler
 
Регистрация: 23.07.2012
Сообщений: 9

Сообщение от Dim@ Посмотреть сообщение
вы про
th = this;
если да, то в переменную th записывается ссылка на объект this (newElement) который передается в setTimeout и в каждом onclick-е эта переменная своя
То есть, setTimeout не видит локальные переменные функции, в которую она вложена?
Ответить с цитированием
  #8 (permalink)  
Старый 23.07.2012, 17:06
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Irish.Tippler,
в принципе да, кстати th лучше не объявлять с var иначе функция таймаута её не увидит
Ответить с цитированием
  #9 (permalink)  
Старый 23.07.2012, 17:10
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

та переменная что находится в функции без var видна в глобалке
var a = 3;//просто глобальная переменная
(function (){
k = 3;//переменная будет видна в глобалке
})()
alert(a + ' ' + k);

а здесь с var выскочит ошибка что переменной k не существует
var a = 3;//просто глобальная переменная
(function (){
var k = 3;//переменная не будет видна в глобалке
})()
alert(a + ' ' + k);//будет ошибка
Ответить с цитированием
  #10 (permalink)  
Старый 23.07.2012, 17:12
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Irish.Tippler Посмотреть сообщение
В чём соль? Почему функция таймаута убирает указатель с текущего элемента?
соль в том, что Вы запутались\не знаете, что this во вложенных функциях равен window, или undefined, если скрипт исполняется в строгом режиме.

пример :

(function () {

    alert(this.foo); // "bar"

    (function () {

        alert(this.foo); // undefined
        alert(Object.prototype.toString.call(this)); // ибо this сменился на ГО\undefined.

    })();

}).call({
    foo: "bar"
});


собстно, тут практически (точнее, совсем другое, но эффект тот же) то же самое :
newElement.onclick = function () {

	this.style.backgroundImage = 'url(./img/' + this.num + '.png)';

        // вот в этой функции this сменится на window.
	setTimeout(function () {
                // а так как this.style вернёт undefined, появится то, что появилось :)
		this.style.backgroundImage = 'none';
	}, 1500);
}


как обойти ?

да просто сохранить контекст в локальной переменной - почему функция будет видеть локальную область видимости той функции, в которой определена - совершенно другой вопрос

newElement.onclick = function () {

*!*
	var _this = this;
*/!*

	this.style.backgroundImage = 'url(./img/' + this.num + '.png)';

	setTimeout(function () {
		// юзаем _this вместо this.
		_this.style.backgroundImage = 'none';
	}, 1500);
}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с конекстом в javascript помогите разобраться nafigator1989 Общие вопросы Javascript 5 20.02.2012 14:56
Вывод данных из базы в цикле со ссылкой на всплывающее окно alexvb Events/DOM/Window 14 10.02.2012 16:16
popup окно в PHP цикле ryobi522 Общие вопросы Javascript 5 10.02.2012 02:18
Помогите с replace! faforty Общие вопросы Javascript 2 28.08.2011 13:10
Помогите! Многоуровневые вкладки! sergeeeeee Элементы интерфейса 2 02.08.2010 23:50