Поскольку вам нужно не только общее решение с некоторыми объектами-контейнерами, но и решение для jqGrid, я могу предложить вам еще один способ.
Проблема в том, что jqGrid уже делает несколько привязок onClick
. Таким образом, вы не будете тратить больше ресурсов, если просто используете существующий в обработчике событий jqGrid. Вам могут пригодиться два обработчика событий: onCellSelect и beforeSelectRow . Чтобы поведение было в основном близко к тому, что у вас есть в настоящее время, я предлагаю вам использовать событие beforeSelectRow . Преимущество состоит в том, что если пользователь нажмет одну из ваших пользовательских кнопок, выбор строки может остаться без изменений. При onCellSelect сначала будет выбрана строка, а затем вызван обработчик события onCellSelect .
Вы можете определить столбцы с помощью кнопок, как показано ниже
{ name: 'add', width: 18, sortable: false, search: false,
formatter:function(){
return "<span class='ui-icon ui-icon-plus'></span>"
}}
В приведенном выше коде я использую пользовательский форматер jqGrid, но без привязки к событию. Код
beforeSelectRow: function (rowid, e) {
var iCol = $.jgrid.getCellIndex(e.target);
if (iCol >= firstButtonColumnIndex) {
alert("rowid="+rowid+"\nButton name: "+buttonNames[iCol]);
}
// prevent row selection if one click on the button
return (iCol >= firstButtonColumnIndex)? false: true;
}
, где firstButtonColumnIndex = 8
и buttonNames = {8:'Add',9:'Edit',10:'Remove',11:'Details'}
. В своем коде вы можете заменить alert
на соответствующий вызов функции.
Если вы хотите выбрать строку всегда по нажатию кнопки, вы можете упростить код до следующего
onCellSelect: function (rowid,iCol/*,cellcontent,e*/) {
if (iCol >= firstButtonColumnIndex) {
alert("rowid="+rowid+"\nButton name: "+buttonNames[iCol]);
}
}
Как вы используете один существующий click
обработчик событий, связанный со всей таблицей (см. исходный код ), и просто говорите jqGrid, какой дескриптор вы хотите использовать.
Я рекомендую вам дополнительно всегда использовать gridview:true
, который ускоряет сборку jqGrid, но который нельзя использовать, если вы используете функцию afterInsertRow
, которую вы рассматривали в качестве опции.
Вы можете увидеть демо здесь .
ОБНОВЛЕНО : Еще один вариант, который у вас есть, это использовать formatter:'actions'
см. демо , подготовленное для ответа . Если вы посмотрите на код форматера 'actions', он работает в основном так же, как ваш текущий код, если вы посмотрите на него со стороны привязки событий.
ОБНОВЛЕНО 2 : обновленную версию кода вы можете увидеть здесь .