hammer.js и warnDefault();

JS также поддерживает сенсорные жесты. Я забиваю голову о предотвращении действий по умолчанию. когда я установил event.preventDefault или же event.gesture.preventDefault() или даже применить параметр {prevent_defaults: true } на молотке он просто запускает действие по умолчанию на якоре. Как я могу предотвратить это и / или что я делаю не так?!

Фрагмент кода;

function initializeNavigation() {
    $("nav").hammer({prevent_defaults: true }).on("tap", "a", function(event) {
        event.preventDefault();
        event.gesture.preventDefault();
        var target = $(this.hash);
        scrollToTarget(target, 1200);
        // if there is an open detailItem then close it.
        if (detailItemOpen) {
            $("div." + detailItemOpen).slideUp();
        }
    })

    if (Modernizr.mq('only screen and (max-width: 767px)'))  {
        initializeMobileMenuAndSetButton();
    }
}

2 ответа

Учитывая Hammer 2.0+ event.gesture это уже не событие, а простой объект.

event.gesture.srcEvent не будет подходящим событием для StopPropagation, поэтому оно не будет работать.

Если вы используете tap событие, и хотите предотвратить щелчки / постукивания по документу, вы можете сделать что-то вроде этого. Нам нужно создать глобальный обработчик крана, который заменит оригинальные методы stopPropagation а также preventDefault

function createHandler(event) {
  return {
    isHandled: false,
    _shouldStopPropagation: false,
    _shoulePreventDefault: false,
    stopPropagation: event.stopPropagation.bind(event),
    preventDefault: event.preventDefault.bind(event),
  }
}


function handleEvent(handler, node) {
  let clickHandler; 


  if (!handler.isHandled) {
    handler.isHandled = true;
    document.addEventListener('click', clickHandler = (event)=> {
      if (handler._shouldStopPropagation) {
        handler.stopPropagation();
        event.stopPropagation();
      }
      
      if (handler._shoulePreventDefault) {
        handler.preventDefault();
        event.preventDefault();
      }
      document.removeEventListener('click', clickHandler, true);
    }, true);
  }
}


// Create a global tap Event so we can replace the original functions
document.addEventListener('tap', (event)=> {
  let handler = createHandler(event);

  event.stopPropagation = function() {
    handler._shouldStopPropagation = true;
    handleEvent(handler);
  };
  event.preventDefault  = function() {
    handler._shoulePreventDefault = true;
    handleEvent(handler);
  }
}, true);

// Now we can use it.
document.addEventListener('tap', (event)=> {
  /* If you want to prevent Default */
  event.preventDefault();

  /* If you want to stop propagation */
  event.stopPropagation();

  /* If you want to do both */
  event.preventDefault();
  event.stopPropagation();
});

Я думаю, что вы также можете попробовать event.stopPropagation() а также event.gesture.stopPropagation(), Но похоже, что Хаммер дает такой метод: event.gesture.stopDetect() за похожий случай.

источник: https://github.com/hammerjs/hammer.js/wiki/Event-delegation-and-how-to-stopPropagation---preventDefaults

Другие вопросы по тегам