Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.02.2018, 20:26
Аспирант
Отправить личное сообщение для alecto Посмотреть профиль Найти все сообщения от alecto
 
Регистрация: 12.11.2014
Сообщений: 84

Передача this в качестве параметра в функцию setTimeout
нужно восстановить значение кнопки, которая была нажата, через определенный промежуток времени.

помогите пожалуйста, не получается разобраться, делаю так:

var fnCounter = function() {
  var tempButton = this.innerHTML;
  this.innerHTML = 'Added';
  setTimeout(fnRestore(this.innerHTML), 1000);
};

function fnRestore(elem) {
  alert(elem);
  elem = "222";
}


elem в функции fnRestore при этом имеет значение "Added", т.е. this.innerHTML был передан в функцию в качестве параметра.
но
elem = "222";
не меняет текст нажатой кнопки.

кроме того fnRestore почему-то срабатывает сразу, а не через 1сек.


если вызывать таймер таким образом
setTimeout(fnRestore, 1000, this.innerHTML);

то функция fnRestore срабатывает через 1сек, но с тем же результатом - я не могу присвоить текст кнопке внутри функции fnRestore.

Последний раз редактировалось alecto, 07.02.2018 в 20:45.
Ответить с цитированием
  #2 (permalink)  
Старый 07.02.2018, 21:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

alecto,
10001 тема про this и setTimeout ... ждите или ищите ссылку на ближайшую тему про это.
Ответить с цитированием
  #3 (permalink)  
Старый 07.02.2018, 21:08
Аспирант
Отправить личное сообщение для alecto Посмотреть профиль Найти все сообщения от alecto
 
Регистрация: 12.11.2014
Сообщений: 84

я находил и на вашем сайте и другие примеры, но код не работает.
Ответить с цитированием
  #4 (permalink)  
Старый 07.02.2018, 21:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

alecto,
пока рабочий пример
<div id="test" >click</div>
 <script>
var fnCounter = function() {
  var tempButton = this;
  this.innerHTML = 'Added';
  setTimeout(function() {
   fnRestore(tempButton)
}, 1000);
};

function fnRestore(elem) {
  elem.innerHTML = '222';
}
test.addEventListener('click', fnCounter, false)
</script>
Ответить с цитированием
  #5 (permalink)  
Старый 07.02.2018, 21:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

alecto,
Сообщение от nerv_
способы решения "детских" проблем с this
медитровать тут
Ответить с цитированием
  #6 (permalink)  
Старый 07.02.2018, 21:46
Аспирант
Отправить личное сообщение для alecto Посмотреть профиль Найти все сообщения от alecto
 
Регистрация: 12.11.2014
Сообщений: 84

рони,
спасибо огромное!
заработало!

я так понял, что моя ошибка была в том, что я использовал
var tempButton = this.innerHTML;

вместо
var tempButton = this;


и функция fnRestore передается внутри анонимной функции
function() {
    fnRestore(tempButton)
  }


я только не понимаю, в чем разница, если синтаксис setTimeout:
setTimeout(func, 1000);

но первоначальный вариант
setTimeout(fnRestore(this.innerHTML), 1000);

работает неправильно.
из-за параметра?
потому что
setTimeout(fnRestore, 1000, tempButton);

работает корректно.
Ответить с цитированием
  #7 (permalink)  
Старый 07.02.2018, 22:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от alecto
setTimeout(fnRestore(this.innerHTML), 1000);
здесь нет функции fnRestore!!! есть только её результат, функция уже "отработала", прежде чем попасть в setTimeout
Ответить с цитированием
  #8 (permalink)  
Старый 07.02.2018, 22:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

alecto,
Пример потери контекста
Ответить с цитированием
  #9 (permalink)  
Старый 07.02.2018, 22:42
Аспирант
Отправить личное сообщение для alecto Посмотреть профиль Найти все сообщения от alecto
 
Регистрация: 12.11.2014
Сообщений: 84

я как раз пробовал Решение 1: сделать обёртку, но не добился результата.
еще раз спасибо, внимательно перечитаю материал по ссылке.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача объекта как параметра в функцию TomTykver jQuery 10 15.04.2016 09:18
передача параметров в функцию TomTykver jQuery 2 27.02.2016 12:28
передача функции в качестве параметра virus-07 Общие вопросы Javascript 3 11.10.2012 12:50
передача параметра в функцию DmitryT Элементы интерфейса 11 19.03.2011 14:02
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01