Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Размножается обработчик событий (https://javascript.ru/forum/misc/32585-razmnozhaetsya-obrabotchik-sobytijj.html)

demoniqus 22.10.2012 12:59

Размножается обработчик событий
 
Помогите понять, почему происходит такое явление:
Я строю грид-таблицу и переопределяю обработчик события на кнопках переключения на другую страницу:
updateListContacts: function (p, r) {
            $.ajax({
                url: '/path/to/script',
                dataType: 'JSON',
                data: {page: p, rows: r},
                type: 'POST',
                success: function (data) {
                    if (typeof void null != typeof data['colmodel'] && data['colmodel'] != null &&
                        typeof void null != typeof data['rows'] && data['rows'] != null) {
                        grid = $('#ListContacts');
                        var cm = data['colmodel'];
                        var rdata = data['rows'];
                        $('#ListContacts').jqGrid("clearGridData");
                        grid.jqGrid({
                            jsonReader: {
                                repeatitems: false, 
                                id: 'NodId'
                            },
                            datatype: 'local',
                            data: rdata,
                            colModel: cm,
                            rowNum: typeof void null != typeof data['rowNum'] && data['rowNum'] != null ? data['rowNum'] : 20,
                            pager: '#ListContactsPager',
                            gridview: true,
                            viewrecords: false,
                            page: typeof void null != typeof data['page'] && null != data['page'] ? data['page'] : 1
                        });

                        grid.jqGrid('setGridParam',{
                            data: rdata,
                            page: typeof void null != typeof data['page'] && null != data['page'] ? data['page'] : 1
                        }).trigger('reloadGrid');
                        var lp = Math.ceil(data['total'] / data['rowNum']);
                        $('#ListContactsPager .ui-icon-seek-first').click(function(){
                            updateListContacts(1, $('#ListContacts').jqGrid('getGridParam', 'rowNum'));
                            return false;
                        });
                        $('#ListContactsPager .ui-icon-seek-prev').click(function(){
                            updateListContacts($('#ListContacts').jqGrid('getGridParam', 'page') - 1, $('#ListContacts').jqGrid('getGridParam', 'rowNum'));
                            return false;
                        });
                        $('#ListContactsPager .ui-icon-seek-next').click(function(){
                            var np = $('#ListContacts').jqGrid('getGridParam', 'page') + 1;
                            if (np <= lp) {
                                updateListContacts(np, $('#ListContacts').jqGrid('getGridParam', 'rowNum'));
                            }
                            return false;
                        });
                        $('#ListContactsPager .ui-icon-seek-end').click(function(){
                            updateListContacts(lp, $('#ListContacts').jqGrid('getGridParam', 'rowNum'));
                            return false;
                        });
                    }
                }
            })
        }

И вот что происходит: при первом нажатии на следующую или предыдущую страницу функция updateListContacts выполняется один раз, при втором нажатии - уже два раза, в третий раз - четыре раза выполняется, потом 8 и так далее...
Как заставить ее выполняться только один раз?

Dmitriyff 22.10.2012 13:28

скорей всего у вас повторно вешается событие на один и тот же элемент

вам стоит либо воспользоваться unbind('click').click(...)

либо вешать live событие на родительский элемент через .on() в каком нить одном месте, ну или вынести так же click

demoniqus 22.10.2012 13:36

unbind помог!
Вопрос: а разве $('selector').click(function(){[native code]}) не затирает все уже имеющиеся обработчики? Или затирает не все, т.е. к примеру не затрагивает bind-овые?

demoniqus 22.10.2012 14:04

что ж... буду теперь знать)))


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