Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Назначение onclick с параметром (https://javascript.ru/forum/events/45154-naznachenie-onclick-s-parametrom.html)

preproger 17.02.2014 10:17

Назначение onclick с параметром
 
Здравствуйте.
Есть код, в нем в цикле генерируются элементы, всем элементам присваевается вывоз ф-ции по событию onclick

li = document.createElement('LI');
li.onclick = toSelected;


Вопрос: как мне по клику присвоить вызов toSelected(1), если я так и напишу, то в li.onclick вернется вызов toSelected(1)

Спасибо.

рони 17.02.2014 10:55

preproger,
оберни в функцию

danik.js 17.02.2014 10:56

Цитата:

Сообщение от preproger
вывоз

:D
IE9+: toSelected.bind(this, 1)
Если нужна поддержка IE8, то либо подключить polyfill, либо писать код так:
onclick = function(){
    toSelected(1);
};


Но так получается что создается каждый раз новая функция. Как альтернатива - можно параметр устанавливать в атрибут элемента: li.setAttribute('data-index', 1)

preproger 17.02.2014 11:00

Спасибо за ответы!
Получилось!

p.s. Да, с "вывозом" забавно получилось )
Цитата:

Сообщение от danik.js (Сообщение 297984)
:D


preproger 17.02.2014 11:15

Столкнулся с проблемой.

Если мы назначаем обработчик
li.onclick = toSelected;


то в теле toSelected this у нас objectHTMLelement (мне это и нужно), а если вызов происходит через

li.onclick = function(){
    toSelected(1);
};


то this - window object.

Подскажите, пожалуйста, почему так происходит и как мне получить ссылку именно на тот li, по которому совершен клик, если мне обязательно вызывать toSelected с параметрами

рони 17.02.2014 11:30

Цитата:

Сообщение от preproger
как мне получить ссылку именно на тот li, по которому совершен клик

Цитата:

Сообщение от danik.js
IE9+: toSelected.bind(this, 1)

проще так или call

kostyanet 17.02.2014 11:40

Цитата:

Сообщение от preproger
Вопрос: как мне по клику присвоить вызов toSelected(1), если я так и напишу, то в li.onclick вернется вызов toSelected(1)

Забейте это кол прямо в элемент и ничего никуда передавать будет не надо.

li.my_nice_property=1;

или по-научному

li.dataset.my_propertya = 1;

в вызове елемент достанет кол из тела и применит

var some = this.dataset.my_propertya;

рони 17.02.2014 11:43

Цитата:

Сообщение от kostyanet
Забейте это кол прямо в элемент и ничего никуда передавать будет не надо.

:-?
Цитата:

Сообщение от danik.js
Как альтернатива - можно параметр устанавливать в атрибут элемента: li.setAttribute('data-index', 1)

:write:
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
</head>

<body>
<script>
function toSelected(a)
{
    alert([this,a])
}
li = document.createElement('LI');
li.appendChild(document.createTextNode('test'));
li.onclick =
li.onclick = function(){
    toSelected.call(li,1);
};
 document.body.appendChild(li);
</script>
</body>

</html>

kostyanet 17.02.2014 11:46

Цитата:

Сообщение от preproger
то в теле toSelected this у нас objectHTMLelement (мне это и нужно), а если вызов происходит через

Кто вызывает - того и this. В первом разе вызывает dom и там своя система связывания и не одна, во втором - js из window. Я сам с трудом ориентируюсь и поэтому забил на дом-ашние онклики.

Есть нормальный скриптовый объект Event через который все делается и будет только лучше все делаться в будущем.

li.addEventListener('click', my_func, false);

И там туева хуча возможностей по управлению событием, в этом Event кроме того.

kostyanet 17.02.2014 11:48

В частности вы можете вешать не всех подряд li, а только одного ul вздернуть. На дыбе он расколется через event какой именно li его сдал. Я про Event.


Часовой пояс GMT +3, время: 15:29.