我正在使用 HammerJS 来处理一个简单的拖放场景。我希望元素在我的边界框的某个区域内时反弹回来,或者如果它在该区域之外则缩小屏幕。我正在使用 isFinal 属性来确定何时调用处理反弹的回调函数。问题是,可能是我不清楚“平移”事件的工作原理,除非释放鼠标时元素仍在移动,否则它会卡住并且 isFinal 属性保持为 false。

所以我需要弄清楚的是如何在元素被释放时随时触发 isFinal 属性。

下面是一些上下文的代码。

    var registerNodeDraggable = function(oArgs) {
        if (!oArgs.id || !oArgs.el) { return; }

        var x = parseInt(oArgs.el.style.left,10) || 0;
        //var y = parseInt(oArgs.el.style.top,10) || 0;

        window[oArgs.id + 'Hammer'] = {
            hammer: new window.Hammer(oArgs.el),
            x: x,
            //y: y
    };

        var obj = window[oArgs.id + 'Hammer'];

        if (obj.hammer) {
            obj.hammer.on('panleft panright', function(e) {
                console.log(e);
                console.log(e.deltaTime);
                console.log(e.type);
                oArgs.el.style.left = obj.x + e.deltaX + 'px';
                // oArgs.el.style.top = obj.y + e.deltaY + 'px';
                if (e.isFinal && oArgs.callback) {
                    console.log('Is Final');
                    obj.x += e.deltaX;
                    //obj.y += e.deltaY;

                    oArgs.callback.call(this, e, obj);
                }
            });
        }
    };

    registerNodeDraggable({
        el: this.$ticker[0],
        id: 'swipe',
        callback: function(e, obj) {

            console.log('I am being called');

            //self.$ticker.velocity({opacity: 0});
            var $container = $('.tickerContainer');
            var offset = $container.offset();
            var tickerOffset = self.$ticker.position();
            var offsetRight = $container.width()  - self.$ticker.width() -  tickerOffset.left;
            var offsetBottom = $container.height() - self.$ticker.height() - tickerOffset.top;

            console.log(offsetRight + ' :Right');
            console.log(tickerOffset.left + ' :Left');


            if( offsetRight < -30 ){
                console.log('Bull');
                self.$ticker.velocity({translateX: 1000, opacity: 0},{duration: 250, complete: function(){
                    self.$ticker.velocity({ left:0, top: 0,  translateX: 0 }, {complete: function() {
                        obj.x = 0;
                        //obj.y = 0;
                         self.pick(self._nextTicker.ticker, 'Bull'); console.log('Bull');
                    } });
                } });

            } else if(tickerOffset.left < -30){
                console.log('Bear');
                self.$ticker.velocity({translateX: -1000, opacity: 0},{duration: 250, complete: function(){
                    self.$ticker.velocity({ left:0, top: 0,  translateX: 0 }, {complete: function() {
                        obj.x = 0;
                        //obj.y = 0;
                        self.pick(self._nextTicker.ticker, 'Bear'); console.log('Bear');
                    } });
                } });
            } else {
                self.$ticker.velocity({
                    left: 0,
                    top: 0 },
                    {duration: 250,
                    complete: function(){
                    obj.x = 0;
                    //obj.y = 0;
                    }
                });
            }
        }
    });

最佳答案

afaik isFinaltrue ,当鼠标被释放时。但我认为,这不是处理它的方式。发现这个:

“isFirst 和 isFinal 是一种内部属性,由 Hammer 使用,但无论如何都会暴露(不会受到伤害)” 1

不要取消 e.isFinal ,而是这样做:

obj.hammer.on('panend',function(e){/*...*/});

但我认为,你必须以另一种方式去做。
因此,据我了解,您希望手动将 isFinal 属性设置为 true ,以便您的“pandleft/right”处理程序触发回调。

试试这个:

初始化锤子对象后,添加一些自定义数据:
window[oArgs.id + 'Hammer'] = {
        hammer: new window.Hammer(oArgs.el),
        x: x,
        //y: y
};
window[oArgs.id + 'Hammer'].hammer.customData = {isFinal: false};

改变
if (e.isFinal && oArgs.callback) {


if (obj.hammer.customData.isFinal && oArgs.callback) {

当你思考的时候,是时候设置 isFinal true (基于你自己的规则和信念):
window[oArgs.id + 'Hammer'].hammer.customData.isFinal = true;

也许,您想在回调中再次将该属性设置为 false

关于javascript - 什么触发了 Hammerjs 中平移事件的 isFinal 属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29549504/

10-11 12:15