gpt4 book ai didi

angularjs - 取消对 child 的 ng-swipe-right

转载 作者:行者123 更新时间:2023-12-03 07:56:08 28 4
gpt4 key购买 nike

在我的 Angular 应用程序中,主体有 ng-swipe左右切换侧边栏。问题是在我的页面中有一个可滚动的水平 DIV。由于 body 的滑动,它不会滚动。

<body ng-swipe-right="sidebar = true" ng-swipe-left="sidebar = false">
<div class="scrollable-x">long content that overflow on x</div>
</body>

有没有办法防止滑动并让子元素滚动?

我试图设置 $event.stopPropagation()在滑动 div 时,滚动条不再切换,但内容不会滚动。

任何的想法?

最佳答案

更新

看了 allenhwkim 的回答,他确实是正确的,$event的传播很容易被阻止。我认为这是理所当然的(没有检查),附加 ng-swipe-*对其他元素的指令将开始触发单独的事件。我显然错了。

HERE更新 fiddle 。

下面的答案基本上是垃圾。
stopPropagation 还有一个问题-- 鼠标向上事件似乎没有触发。

最优雅的解决方案是装饰 ng-swipe-*指令或 $swipe服务——但查看他们的代码,我认为这是不可能的。

其他选项是创建您自己的指令,该指令将手动附加 ng-swipe-* ,照顾编译过程并提供所需的功能。当然,有点复杂。

我想出的是一个快速破解。这个想法是向其后代不应触发 ng-swipe-* 的元素添加一个属性。 .

js

myApp.value('shouldFire', function(element){
var update = true;

// strange enough $event.fromElement is always null
var current = element;
while(current && current != document.body){
if(current.getAttribute('swipe')=='cancel'){
update = false;
break;
}
current = current.parentElement;
}

return update;
})

function MyCtrl($scope, shouldFire) {
$scope.sidebar = false;

$scope.updateSidebar = function($event, show){

var element = $event.toElement || $event.srcElement;
shouldFire(element) && ($scope.sidebar = show);

}
}

html
<div class="cont" ng-swipe-right="updateSidebar($event, true)"
ng-swipe-left="updateSidebar($event, false)">

...

<div class="pan-container" panhandler=""
content-width="500px" swipe="cancel">

UPDATED DEMO

警告
  • 在 android 的 chrome.v.39 中,angular-panhandler 坏了。
  • $event存储适当的触摸事件(android 的 chrome)或自定义事件(桌面的 chrome);在后一种情况下 $event.fromElement总是 null .
  • 提议的解决方案是一种快速破解——它既不优雅也不通用。尽管如此,理论上可以支持多 ng-swipe-*通过在 swipe 中设置不同的值来处理处理程序属性。
  • 关于angularjs - 取消对 child 的 ng-swipe-right,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241168/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com