Удаление всех событий javascript со страницы и их возврат - PullRequest
1 голос
/ 18 ноября 2010

Я бы хотел «приостановить» все события страницы, что означает удаление всего набора событий ... и иметь возможность вернуть их после.

Даже первая часть = удаление всех событий на странице, я не вижу, как это сделать! У вас есть идеи?

Заранее спасибо за помощь, я не нахожу ничего работающего для этого!

Редактировать:

Почему? Я хочу действовать на уже загруженной странице. Пользователь будет взаимодействовать со страницей, и я хочу контролировать взаимодействие ... поэтому удалите все ранее установленные взаимодействия.

Ответы [ 6 ]

1 голос
/ 22 ноября 2010

Вот текущее решение, которое я использую: это не решает проблему полностью!

Я прекращаю событие во время фазы захвата: я помещаю слушателя в объект документа дляпрослушивание всех событий на этапе захвата и остановка распространения.

+:

  • Элемент списка
  • Частично решает проблему

-:

  • не работает для IE (без фазы захвата)
  • , если к документу присоединены другие события, они запускаются перед моим слушателем.

У вас есть лучшее решение?

PS: я буду продолжать обновлять этот пост, если найду лучшее решение

1 голос
/ 18 ноября 2010

Вам необходимо сохранить все прослушиватели событий в карте событий.

EventMap = {

    listeners:[],
    paused:false,

    mapListener:function(eventDispacter, eventType, eventHandler) {
        listeners.push({eD:eventDispacter, eT:eventType, eH:eventHandler});

        if(!paused)
            eventDispacter.addEventListener(eventType, eventHandler);
    },

    unMapListener:function(eventDispacter, eventType, eventHandler) {
        for( var i=0; i<listeners.length; i++) {
            var listener = listeners[i];

            if(listener.eD == eventDispacter && listener.eT == eventType && listener.eH == eventHandler) {
                listeners.splice(listeners.indexOf(listener), 1);
                eventDispacter.removeEventListener(eventType, eventHandler);
            }               
        }
    },

    pauseEvents:function() {
        if(!paused) {}
            for( var i=0; i<listeners.length; i++) {
                var listener = listeners[i];
                listener.eD.removeEventHandler(listener.eT, listener.eH);
            }
        }
    },

    unPauseEvents:function() {
        if(paused) {}
            for( var i=0; i<listeners.length; i++) {
                var listener = listeners[i];
                listener.eD.addEventHandler(listener.eT, listener.eH);
            }
        }
    }
}

Добавить события с помощью

<script>
    function handleClick( e ) {
        alert('Button Clicked');
    }

    EventMap.mapListener(document.getElementById('myButton'), 'click', handleClick);
</script>

Приостановить события с помощью

EventMap.pauseEvents();
1 голос
/ 18 ноября 2010

Вы можете использовать unbind(), чтобы удалить все события

$.unbind();
0 голосов
/ 22 ноября 2010

Вместо отсоединения всех обработчиков событий у вас может быть глобальная логическая переменная paused, которая будет проверяться во всех обработчиках событий.

var paused = false;

function handle_some_click(e) {
    if (!paused) {
        // do something
    }
}
0 голосов
/ 18 ноября 2010

для любых взаимодействий AJAX вы можете, по крайней мере, прервать любые соединения, используя очередь ajax , а для любых текущих анимаций вы можете использовать stop ();

0 голосов
/ 18 ноября 2010

Я не уверен, почему вы сделали бы это ... но вы могли бы поместить весь свой javascript во внешний файл .js (как вы уже должны были сделать). Затем иметь одну функцию javascript, которая жестко запрограммирована на вашей странице ... это будет выглядеть так:

<script type="text/javascript" id="toggle" src="/myExternalJS.js"></script>
<script  type="text/javascript">
var hidden = false;

function toggleScripts() {
     if(hidden) {
          document.getElementById('toggle').setAttribute('src' '/none.js');
    } else {
          document.getElementById('toggle').setAttribute('src' '/myExternalJS.js');
    }
}

Я думаю, это будет работать ... }

...