У меня есть ~ 400 элементов на странице, к которым привязаны события щелчка (4 разных типа кнопок по 100 экземпляров каждого, события щелчка каждого типа выполняют одну и ту же функцию, но с разными параметрами).
Мне нужно свести к минимуму любое влияние на производительность, которое это может иметь. Какой удар по производительности я получаю (память и т. д.), привязывая события кликов к каждому из них по отдельности (используя JQuery bind()
)? Было бы более эффективно вместо этого иметь встроенный onclick
, вызывающий функцию для каждой кнопки?
Изменить для уточнения :):
На самом деле у меня есть таблица (сгенерированная с помощью JQGrid), и каждая строка имеет столбцы данных, за которыми следуют 4 столбца «кнопка» значка — удаление и три другие бизнес-функции, которые делают AJAX обращается к серверу:
|id|description|__more data_|_X__|_+__|____|____| ------------------------------------------------- | 1|___data____|____data____|icon|icon|icon|icon| | 2|___data____|____data____|icon|icon|icon|icon| | 3|___data____|____data____|icon|icon|icon|icon| | 4|___data____|____data____|icon|icon|icon|icon|
Я использую пользовательский форматировщик JQGrid (http://www.trirand.com/jqgridwsiki/doku.php?id=wiki:custom_formatter), чтобы создать «кнопки» значка в каждой строке (я не могу получить HTML-код кнопки с сервера).
Именно здесь, в моей пользовательской функции форматирования, я могу легко создать HTML-код значка и код во встроенном onclick
, вызывающем соответствующие функции с соответствующими параметрами (данными из других столбцов в этой строке). Я использую данные в столбцах строк в качестве параметров для своих функций.
function removeFormatter(cellvalue, options, rowObject) {
return "<img src='img/favoritesAdd.gif' onclick='remove(\"" + options.rowId + "\")' title='Remove' style='cursor:pointer' />";
}
Итак, я могу придумать два варианта:
1) встроенный onclick
, как я объяснил выше
--или--
2) delegate()
(как указано в ответах ниже (большое спасибо!))
- Создайте изображение значка (каждый тип значка имеет собственное имя класса), используя пользовательский форматтер.
- Установите для значка
data()
его параметры в событии afterInsertRow JQGrid. - Примените обработчик
delegate()
к кнопкам определенных классов (как сказал @KenRedler ниже)
> $('#container').delegate('.your_buttons','click',function(e){
> e.preventDefault();
> var your_param = $(this).data('something'); // store your params in data, perhaps
> do_something_with( your_param );
> }); //(code snippet via @KenRedler)
Я не уверен, насколько интенсивным для браузера является вариант № 2, я думаю... но мне нравится держать Javascript подальше от моих элементов DOM :)