Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   td.attachEvent('onclick', newrowdelete); Как привязать событие с параметром? (https://javascript.ru/forum/events/3149-td-attachevent-%27onclick%27-newrowdelete-%3B-kak-privyazat-sobytie-s-parametrom.html)

serge! 23.03.2009 06:29

td.attachEvent('onclick', newrowdelete); Как привязать событие с параметром?
 
Здравствуйте!
Помогите пожалуйста:
Нужно к объекту - ячейки таблицы (td) привязать событие, по которому будет запускаться функция и, чтобы в функцию передавался параметр.
td.attachEvent('onclick', newrowdelete);


newrowdelete - имя функции и, соответственно, есть функция:

function newrowdelete(rowindex)
{
  ...
}

нужно так привязать событие onClick, чтобы при нажатии на объект в функцию newrowdelete передавался параметр - номер удаляемой строки
что-то вроде
td.attachEvent('onclick', newrowdelete(rowindex));
но так, конечно, не работает.

x-yuri 23.03.2009 07:41

а не лучше переписать newrowdelete, чтобы она использовала this для поиска нужной строки или определяла ее другим образом (не через параметр)?

Gvozd 23.03.2009 07:59

решение x-yuri наиболее правильное с точки зрения хорошего кодирования.
от себя добавлю только образец кода, и второй "более простой" способ x-yuri:
function newrowdelete(rowindex)
{
var row=this.parentNode;//теперь row указывает на строку, содержащую td вызвавший событие.его и удлаяем, насколько понимаю
  ...
}

"более простой" способ:
td.attachEvent('onclick', (function(temp){return function(){newrowdelete(temp)})(rowindex) );

serge! 23.03.2009 09:07

Нашёл выход
 
Большое спасибо за ответы!
нашёл другой выход, по-другому идентифицировать строку:
function newrowdelete()
{
  var rowindex=d.activeElement.id;
  var tbody = d.getElementById('tnew').getElementsByTagName('TBODY')[0];
  tbody.removeChild(d.getElementById('r'+rowindex)); //удаление
  form_box.tnew_strkolvo.value=Number(form_box.tnew_strkolvo.value)-1;
}

function addrow()
{
  var tbody = d.getElementById('tnew').getElementsByTagName('TBODY')[0];
  var tr = d.createElement("TR");
  tbody.appendChild(tr);
  ...
  //тут ещё создавал несколько ячеек со всякими атрибутами, как ниже:
  ...
  td = d.createElement("TD");
  tr.appendChild(td);
  //на эту, последнюю ячейку, привязал событие
  td.attachEvent('onclick', newrowdelete);
  //в скрытом поле хранится индекс создаваемой строки = колву строк
  var tnew_strkolvo=Number(form_box.tnew_strkolvo.value)+1;
  //на строку id, а на ячейку, по которой onClick - индекс строки
  tr.setAttribute('id', 'r'+tnew_strkolvo);
  td.setAttribute('id', tnew_strkolvo);
  form_box.tnew_strkolvo.value=tnew_strkolvo;
}


Сделать с помощью this не получилось, я ещё плоховато в Javascript разбираюсь, но буду знать хотя бы что есть такой this и на будущее мне он пригодится.

x-yuri 23.03.2009 18:38

странно, что работает, на самом деле. activeElement - это элемент в фокусе (td по умолчанию не может быть в фокусе). Кроме того, activeElement появилась в HTML 5 и я не уверен в ее кроссбраузерности. Может и не прав - сужу по информации в интернете (а не по опыту ее использования)

по какому принципу определяется удаляемая строка?
Последняя строка таблицы? Тогда лучше
var t = d.getElementById('tnew');
t.deleteRow( t.rows-1 );


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