Помогите с присваиванием стиля в цикле.
Добрый день. Помогите пожалуйста со следующей проблемой.
Присваиваю значение 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". В чём соль? Почему функция таймаута убирает указатель с текущего элемента? |
может так прокатит
newElement.onclick = function () {this.style.backgroundImage = 'url(./img/'+this.num+'.png)';setTimeout(function () {newElement.style.backgroundImage = 'none'}, 1500)}
|
Прокатило бы, если бы такой элемент был у меня один, а то:
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,
вот так катит?
newElement.onclick = function () {th = this; this.style.backgroundImage = 'url(' + this.num + ')';
setTimeout(function () {th.style.backgroundImage = 'none';}, 1500);}
|
Цитата:
|
Цитата:
th = this;если да, то в переменную th записывается ссылка на объект this (newElement) который передается в setTimeout и в каждом onclick-е эта переменная своя |
Цитата:
|
Irish.Tippler,
в принципе да, кстати th лучше не объявлять с var иначе функция таймаута её не увидит |
та переменная что находится в функции без var видна в глобалке
var a = 3;//просто глобальная переменная
(function (){
k = 3;//переменная будет видна в глобалке
})()
alert(a + ' ' + k);
а здесь с var выскочит ошибка что переменной k не существует
var a = 3;//просто глобальная переменная
(function (){
var k = 3;//переменная не будет видна в глобалке
})()
alert(a + ' ' + k);//будет ошибка
|
Цитата:
пример :
(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);
}
|
| Часовой пояс GMT +3, время: 17:51. |