Предотвращение события щелчка с перетаскиванием jQuery

Кажется, что он каким-то образом заблокировал себя на старом, теперь уже несуществующем сервере, и сохранил его после переустановки приложения. Вот как я решил проблему:

В metro bundler выберите тип подключения «Туннель», скопируйте и отправьте URL на свой телефон. Если вы затем щелкните по нему на своем телефоне, он должен перенаправить в приложение выставки. После этого он отклеился, и я снова смог нормально использовать его с QR-кодом!

83
задан gudok 19 February 2019 в 20:22
поделиться

5 ответов

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

Решение для сортировки:

...
.sortable({
...
        start: function(event, ui) {
            ui.item.bind("click.prevent",
                function(event) { event.preventDefault(); });
        },
        stop: function(event, ui) {
            setTimeout(function(){ui.item.unbind("click.prevent");}, 300);
        }
...
})

Решение для перетаскивания:

...
.draggable({
...
        start: function(event, ui) {
            ui.helper.bind("click.prevent",
                function(event) { event.preventDefault(); });
        },
        stop: function(event, ui) {
            setTimeout(function(){ui.helper.unbind("click.prevent");}, 300);
        }
...
})
38
ответ дан 24 November 2019 в 08:50
поделиться

самое легкое и надежное решение? просто создайте прозрачный элемент по своему перемещаемому.

.click-passthrough {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  background: transparent;
}

element.draggable({        
        start: function () {

        },
        drag: function(event, ui) {
            // important! if create the 'cover' in start, then you will not see click events at all
                  if (!element.find('.click-passthrough').length) {
                      element.append("<div class='click-passthrough'></div>");
                  }
        },
        stop: function() {
          // remove the cover
          element.find('.click-passthrough').remove();
        }
    });
0
ответ дан 24 November 2019 в 08:50
поделиться

Пробовали ли вы отключить ссылку с помощью event.preventDefault (); в событии запуска и повторно включить его в событии остановки перетаскивания или событии отпускания с помощью отмены привязки?

0
ответ дан 24 November 2019 в 08:50
поделиться

Я хотел бы добавить к этому, что, похоже, предотвращение события click работает только в том случае, если событие click определено ПОСЛЕ события draggable или sortable. Если событие click добавлено первым, оно активируется при перетаскивании.

11
ответ дан 24 November 2019 в 08:50
поделиться

Решение, которое у меня сработало и не требует тайм-аута: (да, я немного педантичен; -)

Я добавляю класс маркера к элементу при запуске перетаскивания, например "без щелчка". Когда элемент отбрасывается, запускается событие щелчка - точнее, если перетаскивание заканчивается, на самом деле его не нужно отбрасывать на допустимую цель. В обработчике щелчков я удаляю класс маркера, если он есть, иначе щелчок обрабатывается нормально.

$('your selector').draggable({
    start: function(event, ui) {
        $(this).addClass('noclick');
    }
});

$('your selector').click(function(event) {
    if ($(this).hasClass('noclick')) {
        $(this).removeClass('noclick');
    }
    else {
        // actual click event code
    }
});
88
ответ дан 24 November 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: