Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.11.2017, 08:59
Новичок на форуме
Отправить личное сообщение для polinin Посмотреть профиль Найти все сообщения от polinin
 
Регистрация: 26.10.2017
Сообщений: 7

Как вставить в аргумент функции текущее значение переменной?
Есть пример:
for(var i = 0, h; i < 3; i++)
{
	h = document.createElement("button");
	h.innerHTML = "alert = " + i;
	h.onclick = function(){ alert(i); };
	document.body.appendChild(h);
}

Надо чтобы по клику кнопки в сообщении выдавалось значение переменной "i" на момент назначения обработчика клика (0, 1, 2), но все кнопки, естественно, выдают конечное значение "i", равное "3". Как решить такую задачу?
Ответить с цитированием
  #2 (permalink)  
Старый 01.11.2017, 09:02
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Лучше функцию вынести отдельно, чтобы не создавать каждый раз новую.

var onClick = function(i) {
    alert(i);
};

for(var i = 0, h; i < 3; i++)
{
	h = document.createElement("button");
	h.innerHTML = "alert = " + i;
	h.onclick = onClick.bind(h, i);
	document.body.appendChild(h);
}
Ответить с цитированием
  #3 (permalink)  
Старый 01.11.2017, 10:06
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от polinin
Как решить такую задачу?
Использовать замыкание...
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='https://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
</script>
</head>
<body>
<script type='text/javascript'>
for(var i = 0, h; i < 3; i++){
	h = document.createElement("button");
	h.innerHTML = "alert = " + i;
	h.onclick = (function (N){
		return function(){ alert(N); };
	})(i)
	document.body.appendChild(h);
};
</script>
</body>
</html>
Ответить с цитированием
  #4 (permalink)  
Старый 01.11.2017, 10:15
Новичок на форуме
Отправить личное сообщение для polinin Посмотреть профиль Найти все сообщения от polinin
 
Регистрация: 26.10.2017
Сообщений: 7

Сообщение от ruslan_mart Посмотреть сообщение
h.onclick = onClick.bind(h, i);

Про "bind" ничего не знал. Спасибо!
Ответить с цитированием
  #5 (permalink)  
Старый 01.11.2017, 10:22
Новичок на форуме
Отправить личное сообщение для polinin Посмотреть профиль Найти все сообщения от polinin
 
Регистрация: 26.10.2017
Сообщений: 7

Сообщение от ksa Посмотреть сообщение
Использовать замыкание...
Спасибо. Я знакомился с этим разделом JS, но, видимо, усвоил его слабо. Скажите, а если в моем примере будет не 3 кнопки, а 3000, как менее накладно реализовать решение, через bind или замыканием?
Ответить с цитированием
  #6 (permalink)  
Старый 01.11.2017, 10:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

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

polinin,
Делегирование событий
Ответить с цитированием
  #8 (permalink)  
Старый 01.11.2017, 10:37
Новичок на форуме
Отправить личное сообщение для polinin Посмотреть профиль Найти все сообщения от polinin
 
Регистрация: 26.10.2017
Сообщений: 7

Сообщение от рони Посмотреть сообщение
polinin,
Делегирование событий
Спасибо.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите считать значение переменной за пределами функции mxup Общие вопросы Javascript 5 18.02.2017 12:44
Не могу передать значение переменной ни из функции, ни в PHP скрипт через JSON mxup Общие вопросы Javascript 1 17.02.2017 22:10
Видимость переменной при асинхронном запросе. Как передать и получить значение? Stroganov Ilya Общие вопросы Javascript 10 17.10.2014 17:33
как передать значение переменной в IFRAME в поле формы JS-ом из самой страницы? DeUre Общие вопросы Javascript 14 17.12.2013 16:37
Как узнать текущее значение TreePanel? astral_sight ExtJS 3 23.07.2010 13:03