Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.10.2012, 12:59
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Размножается обработчик событий
Помогите понять, почему происходит такое явление:
Я строю грид-таблицу и переопределяю обработчик события на кнопках переключения на другую страницу:
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 и так далее...
Как заставить ее выполняться только один раз?
Ответить с цитированием
  #2 (permalink)  
Старый 22.10.2012, 13:28
Профессор
Отправить личное сообщение для Dmitriyff Посмотреть профиль Найти все сообщения от Dmitriyff
 
Регистрация: 22.07.2012
Сообщений: 164

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

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

либо вешать live событие на родительский элемент через .on() в каком нить одном месте, ну или вынести так же click
Ответить с цитированием
  #3 (permalink)  
Старый 22.10.2012, 13:36
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

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

Последний раз редактировалось demoniqus, 22.10.2012 в 13:43.
Ответить с цитированием
  #4 (permalink)  
Старый 22.10.2012, 14:04
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

что ж... буду теперь знать)))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не удается убрать обработчик событий. mitiya Общие вопросы Javascript 0 08.09.2012 21:18
Какой есть обработчик событий, который будет запускаться после выполнения всего кода? KamalovRadik jQuery 12 08.11.2011 07:14
Возможно прописать обработчик событий не в теге? qwertyuiop Events/DOM/Window 11 24.07.2011 20:38
Обработчик событий kucaeva Общие вопросы Javascript 2 10.12.2010 16:42
обработчик событий kuzroman AJAX и COMET 7 26.11.2010 17:35