Добавить событие в начало очереди - PullRequest
1 голос
/ 28 января 2009

Я уже определил событие onclick. Я хочу добавить дополнительную функцию обратного вызова, которая будет вызываться ДО уже определенного обратного вызова.

  • Как добавить событие в начало очереди для конкретного типа события?

Ответы [ 6 ]

1 голос
/ 29 января 2009

супер. Это заставило меня взглянуть на jquery doc, и я обнаружил, что объединение решения crescentfresh с методом jQuery unbing () (аналог Extjs.removeAll ()) решит мою проблему.

Итак, в конце у меня есть это:

this.onclick = function( e ) 
        if ( /*trigger clause*/ true ) { 
          //cancel all events
          $(this).unbind();
          return false;
        } else {
          //continue processing  
          return original ? original.apply(this, arguments) : true;
        }
      }

Спасибо за советы, ребята!

PS Какие придурки сделали этот ужасный редактор ответов ??! Вставить код сюда - головная боль.

PPS К сожалению, я не могу проголосовать за два ответа и не могу поднять полезную оценку за ваш ответ из-за отсутствия репутации, и я не могу отметить более одного ответа как приемлемого. Поэтому, пожалуйста, прости меня. Глупый форумный движок, но тут действительно классные люди

1 голос
/ 28 января 2009

Если вы используете attachEvent для IE, вы не можете гарантировать порядок запуска событий. Смотри http://msdn.microsoft.com/en-us/library/ms536343(VS.85).aspx

Если вы присоединяете несколько функций к одно и то же событие на том же объекте, функции вызываются в случайном порядке, сразу после события объекта обработчик называется.

(я действительно видел, что события вызываются в обратном порядке, а не случайно). Как бы то ни было, библиотеки обычно склонны использовать attachEvent в глубине, так что вы застряли с той же проблемой.

Сказав, что, если вы можете проверить узел на наличие обработчиков 'click' (например, у вас есть настройка атрибута "onclick" на вашем узле в вашей разметке), то вы можете поставить "ваш" впереди "своих":

var nodes = document.getElementsByTagName('*'); // collect your nodes however
for(var i=0; i < nodes.length; i++) {
    var node = nodes[i];
    if(!node.onclick)
        continue;

    // At this point we have a node with an "onclick" attr.
    // Hijack onclick to do something else first.
    var original = node.onclick;
    node.onclick = function() {
        doSomethingElse();
        return original.apply(this, arguments);
    }
}

См. этот ответ , чтобы узнать, как проверить события узла в других библиотеках (если вы их используете). Вы также можете использовать его для doSomethingElse() с этими библиотеками.

0 голосов
/ 28 января 2009

Вы работаете с JQuery Framework? В настоящее время я работаю с extjs и нашел класс, который вы можете использовать или скопировать

Посмотрим на http://extjs.com/deploy/dev/docs/ Ext> EventManager> removeAll ()

removeAll (строка / HTMLElement el): void Удаляет все обработчики событий из элемент. Как правило, вы будете использовать Ext.Element.removeAllListeners непосредственно на элемент в пользу называя эту версию. Параметры: el: String / HTMLElement Идентификатор или HTML элемент для удаления события Возвращает: недействительно

Я думаю, вы можете установить тег body как HTMLElement, чтобы закрыть все события. (не проверено извините)

Скачать здесь http://extjs.com/products/extjs/build/> выбрать адаптер jquery, если вы работаете с jquery> extcore будет достаточно (он содержит EventManager.js).

С другой стороны, как и crescentfresh (ответ № 4), я сделал этот пример кода для применения ко всем событиям узла:

var nodes = document.getElementsByTagName('*'); // collect your nodes however
for(var i=0; i < nodes.length; i++) {
     var node = nodes[i];
     Ext.EventManager.removeAll(node);
    }
}

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

0 голосов
/ 28 января 2009

Вы можете просто остановить прослушиватели событий, просто загрузив эту примерную функцию с правильными параметрами:

   function removeEvent(obj,type,fn){
  if(obj.removeEventListener) obj.removeEventListener(type,fn,false);
  else if(obj.detachEvent){
    obj.detachEvent("on"+type,obj[type+fn]);
    obj[type+fn]=null;
    obj["e"+type+fn]=null;
  }
}

Кроме того, вы можете запустить setTimeout в событии, которое убивает других слушателей, и повторно включить слушателя по одному, внешне или с другим setTimeout.

Библиотека для отладки событий, может быть полезна.

0 голосов
/ 28 января 2009

Вы можете остановить действие по умолчанию для события с помощью protectDefault () или остановить распространение вложенного события с помощью stopPropagation () , чтобы разрешить запуск только вашего конкретного события.

Но пауза или задержка события без использования setTimeout () , остановка, сохранение его состояния и повторный запуск в очереди невозможны.

0 голосов
/ 28 января 2009

addEventListener позволяет добавить другое событие. Обратите внимание, что в IE вам придется использовать attachEvent.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...