Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.11.2012, 09:48
Интересующийся
Отправить личное сообщение для seyfer Посмотреть профиль Найти все сообщения от seyfer
 
Регистрация: 16.11.2012
Сообщений: 16

Выполнение события 1 раз и снятие события?
Возможно ли это?

Например я хочу удалить событие вот так:

//где-то назначаю событие
eventUtility.addEvent(block_edit, "click", addSeats);

-----------------------------где-то в другом файле в другой области-----------------------

//ф-я обработчик
var addSeats = function() {

        var rows_div = document.getElementById("add_seats_rows");
        var cols_div = document.getElementById("add_seats_cols");
    //что-то делаем

eventUtility.removeEvent(block_edit, "click", addSeats);

    }


Т.е. я хочу, чтобы событие выполнилось 1 раз и с элемента снялся обработчик.

jquery не предлагать.

Последний раз редактировалось seyfer, 21.05.2013 в 08:58.
Ответить с цитированием
  #2 (permalink)  
Старый 16.11.2012, 10:13
Интересующийся
Отправить личное сообщение для seyfer Посмотреть профиль Найти все сообщения от seyfer
 
Регистрация: 16.11.2012
Сообщений: 16

Сделал так:
var addSeats = function() {
        if (seats.added != true)
        {
            //            eventUtility.removeEvent(block_menu_form, "click", addSeats);

            var rows_div = document.getElementById("add_seats_rows");
            var cols_div = document.getElementById("add_seats_cols");
            

            seats.added = true;
        }

    }


Если нужно повторить, то seats.added = false;
seats - глобальный объект.

Еще варианты?
Ответить с цитированием
  #3 (permalink)  
Старый 17.11.2012, 14:40
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

block_edit.addEventListener('click', addSeats);

var addSeats = function() {
 
        var rows_div = document.getElementById("add_seats_rows");
        var cols_div = document.getElementById("add_seats_cols");
        //что-то делаем
 
        block_edit.removeEventListener("click", addSeats);
}


То-есть именно так как вы написали в самом начале. А в чем собственно проблема? У вашего eventUtility отсутствует метод removeEvent() ? значит нужно его дописать. Гуглим по теме "кроссбраузерный addEventListener"
Ответить с цитированием
  #4 (permalink)  
Старый 19.11.2012, 13:36
Интересующийся
Отправить личное сообщение для seyfer Посмотреть профиль Найти все сообщения от seyfer
 
Регистрация: 16.11.2012
Сообщений: 16

Есть конечно removeEvent(), но назначается он в одном месте, а снимается в другом и ф-я назначенная на эвент не глобальная
Пробовал засунуть ф-ю в глобальный объект, но не сработало тоже.
Например:
var actions = {addSeats : function () {} }


В программе
eventUtility.addEvent(block_edit, "click", actions.addSeats);

в другой области видимости
eventUtility.removeEvent(block_edit, "click", actions.addSeats);

не снимает.

danik.js
Вообще ваш комментарий идиотский. Во первых не заметили, что у меня таки есть removeEvent() в коде выше, во вторых не поняли проблему совершенно.

Последний раз редактировалось seyfer, 19.11.2012 в 13:38.
Ответить с цитированием
  #5 (permalink)  
Старый 19.11.2012, 15:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Вобще-то ваш вопрос идиотский. Верней, у вас даже вопроса нет. Про возможность - не в счет.

Вы приводите код:

//где-то назначаю событие
eventUtility.addEvent(block_edit, "click", addSeats);
 
ф-я обработчик
var addSeats = function() {
 
        var rows_div = document.getElementById("add_seats_rows");
        var cols_div = document.getElementById("add_seats_cols");
    //что-то делаем
 
eventUtility.removeEvent(block_edit, "click", addSeats);
 
    }


addSeats в области видимости обоих вызовов. Стало быть код ваш не работает (вы привели код, но даже не прокомментировали его) из-за отсутствия/кривости removeEvent. А во втором комментарии вы вообще закомментили этот вызов. Это можно понимать как то, что у вас нет такого метода.

Далее, я привожу код, используя нативные методы (чтоб сработало наверняка), причем ЯСНО ПИШУ, что код идентичен вашему.

Короче, прежде чем что-то писать, думайте, это полезно.

Цитата:
не поняли проблему совершенно
Может, потому что вы ее не описали? Вы описали задачу, вы привели код, решающий вашу задачу, но даже не написали в чем собственно проблема.
Ответить с цитированием
  #6 (permalink)  
Старый 11.12.2012, 08:12
Интересующийся
Отправить личное сообщение для seyfer Посмотреть профиль Найти все сообщения от seyfer
 
Регистрация: 16.11.2012
Сообщений: 16

danik.js
И все таки вы идиот.
Комментарии написаны, они как раз и описывают проблему. Области видимости РАЗНЫЕ, см. комментарий:

//где-то назначаю событие


Это не значит, что прямо выше ф-ии. Код приведен только для примера, вы мыслите слишком узко.

Код removeEvent работает кроссбраузерно.

/**
     * удаление события с элемента
     * @param {type} el
     * @param {type} type
     * @param {type} fn - имя ф-ии
     * @returns {undefined}
     */
    removeEvent: function(el, type, fn) {

        if (el) {
            if (typeof removeEventListener !== "undefined") {
                el.removeEventListener(type, fn, false);
            } else if (typeof detachEvent !== "undefined") {
                el.detachEvent("on" + type, fn);
            } else {
                el["on" + type] = null;
            }
        }

    },


Убейтесь, недоразработчик.
Тут как бы форум по javascript и я ожидаю адекватные ответы по теме, а не идиотские придирки или тупые ответы.
Ответить с цитированием
  #7 (permalink)  
Старый 11.12.2012, 08:16
Интересующийся
Отправить личное сообщение для seyfer Посмотреть профиль Найти все сообщения от seyfer
 
Регистрация: 16.11.2012
Сообщений: 16

Вообще было бы интересно все таки получить ответ от кого-то более адекватного.

Получалось ли у кого-то снимать событие внутри ф-ии, которая навешана на это же событие?

Изначально думал так делать. Но событие не снималось, в итоге сделал через переменную-метку.
Ответить с цитированием
  #8 (permalink)  
Старый 11.12.2012, 10:20
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от seyfer
И все таки вы идиот.
Сообщение от seyfer
Вообще было бы интересно все таки получить ответ от кого-то более адекватного.
Вы оскорбляете людей и просите помощи?
Я не думаю что кто то захочет вам помогать!
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #9 (permalink)  
Старый 11.12.2012, 10:34
Аспирант
Отправить личное сообщение для Sanda Посмотреть профиль Найти все сообщения от Sanda
 
Регистрация: 12.10.2012
Сообщений: 90

Вообще можно было попробовать без своего EventUtils, прежде чем начинать оскорбления. Не знаю, у кого как, а у меня под FF отлично работает. Ищите ошибку в утилсах.
<body>
<script>
(function () {
  var doc = document;
  var btn = doc.createElement('button');
  btn.appendChild(doc.createTextNode('Click me'));
  doc.body.appendChild(btn);
  var handler = function () {
    alert('It works!');
    btn.removeEventListener('click', handler);
  }
  btn.addEventListener('click', handler);
}());
</script>
</body>
Ответить с цитированием
  #10 (permalink)  
Старый 21.05.2013, 08:57
Интересующийся
Отправить личное сообщение для seyfer Посмотреть профиль Найти все сообщения от seyfer
 
Регистрация: 16.11.2012
Сообщений: 16

Ни кто так и не понял задачи. Смотрите пример кода и пишете как видите. Прочитайте внимательно описание.

addEventListener и removeEventListener вызываются в разных областях видимости у меня! Вы приводите примеры в одной области видимости, и пишете, что работает.

Конечно так работает!!!
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение проверки после наступления события juggalo Events/DOM/Window 6 06.10.2012 01:37
Выполнение действия 1 раз в сутки на Cookie fAmOus Элементы интерфейса 3 29.07.2012 23:10
Выполнение события с последующей задержкой spider84 Events/DOM/Window 4 09.08.2011 09:41
Выполнение скрипта раз в сутки по cookie Avel Mink Элементы интерфейса 16 29.04.2011 09:38