在某些元素上取消后台滑动处理程序

Posted

技术标签:

【中文标题】在某些元素上取消后台滑动处理程序【英文标题】:Background swipe handler to be cancelled on certain elements 【发布时间】:2014-03-25 12:08:57 【问题描述】:

我的网站上有此代码,因此您可以使用滑动返回/前进

$(function() 
  $(window).on("swipeleft", jqmForward)
           .on("swiperight", jqmBack);
);

问题是,当您尝试在已经有自己的滑动处理程序(例如 3rd-party 幻灯片库)上滑动时,它也会后退/前进

如何让它只在“后台”工作(忽略某些具有自己的滑动处理程序的元素)?

编辑: 简化了上面的代码,我尝试了这个但不起作用(可能是因为我将它添加到窗口而不是单个 div)

$('.swiper-wrapper').off();

【问题讨论】:

$(window).not("skipThis").on(swipeleft, .... @Omar:谢谢,但现在它根本不起作用(也没有错误) 【参考方案1】:

我最终得到了一个全局变量 allowGlobalSwipe 并使用 Swiper API 动态禁用它。

var allowGlobalSwipe = true; // <--

$(function() 
  $(window).on("swiperight", jqmBack);

  $('#slideContainer').swiper(
    onTouchStart: function ()  allowGlobalSwipe = false; ,   // <--
    onTouchEnd: function ()  allowGlobalSwipe = true; 
  );
);

function jqmBack(e) 
  if (!allowGlobalSwipe) return;  // <--

  var prevpage = $('div.ui-page-active').prevAll('div[data-role="page"]');
  if (prevpage.length > 0)
    $.mobile.changePage($(prevpage[0]),  transition: "slide", reverse: true , true, true);

【讨论】:

您已经实现了自己的方法来阻止事件传播,但已经存在一种方法。您应该能够选择您不想激活全局滑动的元素并停止touchmove:$([some elements]).on("touchmove", function (event) event.stopPropagation();) 的传播。其他相关事件为touchstarttouchend 但我使用的是 Swiper,而不是我自己的代码。还是我错过了什么?

以上是关于在某些元素上取消后台滑动处理程序的主要内容,如果未能解决你的问题,请参考以下文章

Android,从“最近的应用”中删除应用时取消通知

当后台服务取消暂停或重新启动时,iOS 应用程序需要多长时间?

滑动切换焦点辅助元素 iOS

推送静默远程通知:当应用程序在后台运行时取消警报

向上滑动(将应用程序置于后台)并且视频在自定义 AVPLayer 中播放时如何停止画中画?

拦截(可能取消)页面的鼠标/键盘事件处理程序