Проблема с множественной обработкой событий в JQuery - PullRequest
0 голосов
/ 10 апреля 2010

У меня странная проблема jquery с несколькими обработчиками событий. Чего я пытаюсь добиться, так это:

  1. Пользователь выделяет текст на странице
  2. Если выбор не пустой - показать контекстное меню
  3. Если пользователь щелкает где-то еще - контекстное меню должно исчезнуть

У меня проблемы с вышеперечисленным, то есть иногда контекстное меню отображается правильно, иногда оно появляется и исчезает сразу после того, как пользователь сделал выбор. Пожалуйста помоги. Смотрите соответствующие части моего кода ниже. Также, когда пользователь выбирает абзац или слово двойным щелчком мыши - контекстное меню появляется и быстро снова исчезает.

var ContextMenu = {
   ...
        show: function(e) {
            var z = this;
            if (!this.shown) {
                if (this.contextMenu) {
                    this.contextMenu.css({
                        left: e.pageX,
                        top: e.pageY
                    }).slideDown('fast');
                    this.shown = true;
                }
                var hideHandler = function() {
                    z.hide(this);
                };
                $(document.body).bind("click", hideHandler);
            }
        },
        hide: function(hideHandler) {
            if (this.contextMenu && this.shown) {
                this.contextMenu.slideUp('fast');
                this.shown = false;
                $(document.body).unbind("click", hideHandler);

            }
        }
};
    // Context menu display logic
    $(document.body).bind("mousedown mouseup", function(e) {
        if ((window.getSelection().toString() != "") && (!ContextMenu.shown)) {
            ContextMenu.show(e);
        }
    });

1 Ответ

0 голосов
/ 10 апреля 2010

Проверьте, помогает ли привязка события только к mouseup:

$(document.body).bind("mouseup", function(e) {
     if ((window.getSelection().toString() != "") && (!ContextMenu.shown)) {
         ContextMenu.show(e);
     }
 });

Из того, что я понимаю, вам не нужно связывать это с событием mousedown.

Я думаю, если вы связываете его с событием mousedown и пользователь делает выбор, перетаскивая мышь (и нажимая кнопку), отображается ваше контекстное меню (mousedown) и click обработчик привязан к документу, пока кнопка мыши еще нажата . Таким образом, после отпускания кнопки мыши (после завершения выбора), a click выполняется , а ранее связанный обработчик click выполняется , в результате чего меню снова исчезает.

Хотя я могу ошибаться;)

...