Есть код, кусочек на jquery - все хорошо работает (первая кнопка), но если кликнуть на вторую кнопку, к которой событие регистрируется при помощи addEventListener, то теряю контекст, that - это кнопка, this - объект опций ajax.
Как тогда при клике по второй кнопке вызвать _.setText() изнутри getAjax() ?
$(function() {
var _ = {
initJquery: function() {
var that = this;
$('#one').on('click', function() {
that.getAjax();
});
},
initJs: function() {
$('#two')[0].addEventListener('click', this.getAjax);
},
setText: function(text) {
$('.update').html(text);
},
getAjax: function() {
var that = this;
$.ajax({
url: 'txt.txt',
type: 'POST',
dataType: 'text'
})
.done(function(resp) {
console.log('this');
console.log(this);
console.log('that');
console.log(that);
// при нажатии первой кнопки всё хорошо
// тут теряю контекст при нажатии второй кнопки addEventListener
that.setText(resp);
})
.fail(function() {
console.log("error");
});
}
};
_.initJquery();
_.initJs();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input type="button" id="one" value="Кнопка 1">
<input type="button" id="two" value="Кнопка 2">
<div class="update"></div>
Результат
Всем спасибо, разобрался. Надо было так:
.done(function() {
this.setText(resp);
}.bind(this))
Итоговый код такой:
$(function() {
var _ = {
initJquery: function() {
$('#one').on('click', function() {
this.getAjax();
}.bind(this));
},
initJs: function() {
$('#two')[0].addEventListener('click', this.getAjax.bind(this));
},
setText: function(text) {
$('.update').html(text);
},
getAjax: function() {
$.ajax({
url: 'txt.txt',
type: 'POST',
dataType: 'text'
})
.done(function(resp) {
console.log('this');
console.log(this);
this.setText(resp);
}.bind(this))
.fail(function() {
console.log("error ajax");
}.bind(this));
}
};
_.initJquery();
_.initJs();
});

Вообще, это конечно вопрос стиля и конвенций проекта, но лично я стараюсь писать как можно больше bind и стрелочных функций и как можно меньше me/self/that.
– Утка Учится Укрываться Jun 16 '16 at 21:12$('#two')[0].addEventListener('click', this.getAjax.bind(this));работает только сvar that = this;– Jean-Claude Jun 17 '16 at 07:21