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.

kostyanet 17.02.2014 11:52

рони, Да, на js народ ресурсами вообще не парится. История показала что клиенты стали в стопицот раз жирнее серверов, особенно в бедных странах типа РФ. На сервере мне 32 мегабайта под скрипт выделяют и 30 секунд, а на клиенте можно и гиг зохавать - не обеднеет.

preproger 17.02.2014 12:12

Большое спасибо за ответы!
Воспользовался методом из 3 сообщения!

li.setAttribute('data-id', 0);


а в ф-ции

type = this.getAttribute('data-id');

preproger 17.02.2014 16:15

Подскажите, пожалуйста.
Частично реализовал требуемый ф-ционал, но возникла проблема.

Требуется из массива имен сделать список сотрудников.
Имеем второй список с выбранными сотрудниками.

По клику сотрудник переносится в выбранные и обратно.

Проблема: жму на 1ого, переносится 2ой (на 2ого 3ий).

Дебажил. Везде все ID и имена совпадают.
Получаю номер элемента массива с именами, удаляю из него, переношу в новый массив. Вывожу - имя другое.

Ссылка на http://jsfiddle.net/hmJjL/1/ все видно наглядно...
Похоже я уже закипел и не вижу, скорее всего, очевидную ошибку

preproger 17.02.2014 17:06

Нашел причину ошибки!
Невнимательность. Работал с 1 массивом, а вывел другой.


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