Использование this
через функции Javascript
Ваша проблема похожа на общую проблему, позвольте мне показать вам несколько способов ее решения.
Проблема обычно возникает в window.setTimeout()
вызовах, поскольку this
указывает на window
после первого вызова.
Пример кода:
function testObj() {
this.a = "foobar";
this.b = function() {
console.log(this,this.a)
window.setTimeout(this.b,1000)
}
this.b();
}
new testObj();
выход
testObj "foobar"
DOMWindow undefined
После следующего вызова функция выводит на консоль DOMWindow
, что неверно. Это происходит потому, что функции window.setTimeout()
назначают новый this
с .apply()
.
Использование переменной для хранения this
вне функции
Если вы хотите сохранить значение this
, вам следует использовать переменную и сохранить ее здесь.
Пример кода:
function testObj() {
var $this = this;
this.a = "foobar";
this.b = function() {
console.log($this,$this.a,"and this:",this)
window.setTimeout($this.b,1000)
}
this.b();
}
new testObj();
Выход:
testObj "foobar" "and this:" testObj
testObj "foobar" "and this:" DOMWindow
testObj "foobar" "and this:" DOMWindow
testObj "foobar" "and this:" DOMWindow
...
Этот код использует переменную $this
для хранения оригинальной this
, которая указывает на testObj
.
Также вы можете видеть, что после первого звонка this
указывает на DOMWindow
.
Использование .bind
для сохранения оригинала this
Функция window.setTimeout применяет новую цель this
к вызываемой функции. Если вы хотите предотвратить применение новой этой цели к функции, вам следует использовать функцию .bind()
.
Пример кода
function testObj() {
var $this = this;
this.a = "foobar";
this.b = function() {
console.log(this,this.a)
window.setTimeout(this.b,1000)
}.bind(this);
this.b();
}
new testObj();
Выход:
testObj "foobar"
testObj "foobar"
testObj "foobar"
testObj "foobar"
...
В вашем случае
Вы должны использовать переменную и хранить this
или .id
в локальной переменной.
$('#'+'[id*="world_map"]').click(function() {
var id = this.id;
$('#' +id+ '_panel_container').css('visibility','visible');
$('#text_button').click(function() {
$('#' +id+ '_panel_container').css('display','none');
});
});