淡定啊淡定

news/2025/2/26 4:58:04

一些前端效果在dom的事件处理上比较啰嗦,而公司的framework乃至browser也总是出一些奇特的现象。。

于是bug出现了,改着改着就不淡定了。。

事实证明必须淡定,不淡定你永远没能力!

首先把自己写的代码逐一检查,必要时jshint发现一些语法上不规范的地方,比如循环内部不该干的事(= =;;)

然后把整体划分为各个功能性逻辑,比如计数是否准确?是否有必要阻挡冒泡?

如果确认了每部分代码都是正确的而结果不正确,那一定是时序出了问题。

如果时序也没有问题,可是事件的响应有些失控。。必要时下一些不太干净的狠手段,比如加flag。。

下面我模拟drag事件的时候就用一个flag阻断了多余的touchmove,在touchstart时还原。

否则我每拖一次,touchmove响应N多次,次数还不一定。

很难判断是用框架绑定时间的问题,还是其他问题。

一时得不到解决,或者说根本没人来解决,只有自己屏蔽了。

itu.xcontrol.define("tabMain", {

    views: ["tabMain.html"],
    _fnOnTouchStart: null,
    _fnOnTouchMove: null,
    _fnOnTouchEnd: null,
    _touchStartPosX: null,
    _touchStartPosY: null,

    constructor: function() {
        try {
            var me = this;
            me._fnOnTouchStart = iAuto.Util.bind(me, me._onTouchStart);
            me._fnOnTouchMove = iAuto.Util.bind(me, me._onTouchMove);
            me._fnOnTouchEnd = iAuto.Util.bind(me, me._onTouchEnd);

        } catch (e) {
            iAuto.Logger.error(e.stack);
        }
    },
    config: {

    },
    titles: ".titles",
    divs: "#tabMain_div",
    press: "pressed",
    left: "fromleft",
    right: "fromright",
    pop: "#tabMain_popularlist1",
    channel: "#tabMain_channelslist1",
    playlist: "#tabMain_playlists1",
    CUR: 1,
    tabs: ".tabs",
    TAB: "#tabMain_tabs",
    NONE: "none",
    isdoing: "false",

    onCreate: function() {
        this.setView("tabMain.html", {});
    },

    _createCmp_: function() {
        itu.xcontrol.create('popularList', 'tabMain_popularlist1', {});
        itu.xcontrol.create('channelsList', 'tabMain_channelslist1', {});
        itu.xcontrol.create('playLists', 'tabMain_playlists1', {});
    },

    _bindEvent_: function() {
        var me = this;
        itu.event.addListener('tabMain_popularlist1', {
            'name': 'popularList_pressed',
            'callback': me.on_tabMain_popularlist1_popularList_pressed,
            'context': me
        });
        itu.event.addListener('tabMain_channelslist1', {
            'name': 'channelsList_pressed',
            'callback': me.on_tabMain_channelslist1_channelsList_pressed,
            'context': me
        });
        itu.event.addListener('tabMain_playlists1', {
            'name': 'playList_pressed',
            'callback': me.on_tabMain_playlists1_playList_pressed,
            'context': me
        });
    },

    bindEvents: function() {
        try {
            var me = this;
            var $el = me.$element;
            var $titles = $el.find(me.titles);
            var $tab = $el.find(me.tabs);
            $tab.bind('touchstart', me._fnOnTouchStart);
            $tab.bind('touchmove', me._fnOnTouchMove);
            $tab.bind('touchend', me._fnOnTouchEnd);
            itu.event.on($titles, "touchstart", me.animateIn, me);
            itu.event.on($titles, "touchend", me.triggerTitles, me);
            for (var i = 1; i < 4; i++) {
                $(me.divs + i).attr("data-num", i);
            }
        } catch (e) {
            iAuto.Logger.error(e.stack);
        }
    },

    unbindEvents: function() {
        try {
            var me = this;
            var $el = me.$element;
            var $titles = $el.find(me.titles);
            var $tab = $el.find(me.tabs);
            $tab.unbind('touchstart');
            $tab.unbind('touchmove');
            $tab.unbind('touchend');
            itu.event.off($titles, "touchstart");
            itu.event.off($titles, "touchend");

        } catch (e) {
            iAuto.Logger.error(e.stack);
        }
    },

    animateIn: function(evt) {
        var me = this;
        var n = parseInt($(evt.target).data("num"));
        iAuto.Logger.log("[tabMain] num is:::", n);
        me.activeTitle(n);
        me.CUR = n;
    },

    triggerTitles: function(evt) {
        var me = this;
        var $el = me.$element;
        var id = $(evt.target).data("num");
        $el.trigger("title" + id + "_pressed");
    },

    onShow: function() {
        iAuto.Logger.log("[tabMain] onShow");
        var me = this;
        me.bindEvents();
    },

    onHide: function() {
        iAuto.Logger.log("[tabMain] onHide");
        var me = this;
        me.unbindEvents();
    },

    on_tabMain_popularlist1_popularList_pressed: function(evt) {
        // TODO Auto-generated method stub
        var me = this, $el = me.$element;
        var id = evt.data;
        me.CUR = 1;
        $el.trigger("popular_pressed", id);
    },

    on_tabMain_playlists1_playList_pressed: function(evt) {
        // TODO Auto-generated method stub
        var me = this, $el = me.$element;
        var id = evt.data;
        me.CUR = 2;
        $el.trigger("playlist_pressed", id);
    },

    on_tabMain_channelslist1_channelsList_pressed: function(evt) {
        // TODO Auto-generated method stub
        var me = this, $el = me.$element;
        var id = evt.data;
        me.CUR = 3;
        $el.trigger("channel_pressed", id);
    },
    setTitles: function(arr) {
        var me = this;
        var titles = arr;
        for (var i = 0; i < titles.length; i++) {
            $(me.divs + (i + 1)).html(titles[i] + '<div id="" class="span" style=""></div>');
        }
    },
    showPop: function(data) {
        var me = this;
        var item = data;
        var pop = me.getCmp("tabMain_popularlist1");
        pop.update(item);
        $(me.channel).hide();
        $(me.playlist).hide();
        $(me.pop).show();
    },
    showChannel: function(data) {
        var me = this;
        var item = data;
        var channel = me.getCmp("tabMain_channelslist1");
        channel.update(item);
        $(me.playlist).hide();
        $(me.pop).hide();
        $(me.channel).show();
    },
    showPlaylist: function(data) {
        var me = this;
        var item = data;
        var playlist = me.getCmp("tabMain_playlists1");
        playlist.update(item);
        $(me.channel).hide();
        $(me.pop).hide();
        $(me.playlist).show();
    },
    _onTouchStart: function(evt) {
        try {
            var me = this;
            if (evt.touches.length === 1) {
                me._touchStartPosY = parseInt(evt.touches[0].pageY);
                me._touchStartPosX = parseInt(evt.touches[0].pageX);
                evt.stopPropagation();
                me.isdoing = false;
            }
        } catch (e) {
            iAuto.Logger.error(e.stack);
        }
    },

    _onTouchMove: function(evt) {
        try {
            var me = this;
            var $el = me.$element;
            var currentPositionX = parseInt(evt.touches[0].pageX);
            var currentPositionY = parseInt(evt.touches[0].pageY);
            var offsetX = currentPositionX - me._touchStartPosX;
            var offsetY = currentPositionY - me._touchStartPosY;

            if (Math.abs(offsetY) > 30) {
                if (me.scroller !== null) {
                    itu.event.on(me.scroller, "scrollend", me.refreshMore, me);
                }
                return;
            }
            var isLeft = (Math.abs(offsetY) / Math.abs(offsetX) < 0.33) && offsetX < 0;
            var isRight = (Math.abs(offsetY) / Math.abs(offsetX) < 0.33) && offsetX > 0;
            if (isRight) {
                if (me.isdoing === true) {
                    return;
                }
                iAuto.Logger.log("[tabMain] _onTouchMove currentPositionX", currentPositionX);
                iAuto.Logger.log("[tabMain] _onTouchMove touchStartPosX", me._touchStartPosX);
                me.CUR--;
                if (me.CUR < 1) {
                    me.CUR = 3;
                }
                $el.trigger("title" + me.CUR + "_pressed");
                me.activeTitle(me.CUR);
                iAuto.Logger.log("[tabMain] go right CUR:::after", me.CUR);
                me.isdoing = true;
            }
            if (isLeft) {
                if (me.isdoing === true) {
                    return;
                }
                iAuto.Logger.log("[tabMain] _onTouchMove currentPositionX", currentPositionX);
                iAuto.Logger.log("[tabMain] _onTouchMove _touchStartPosX", me._touchStartPosX);
                me.CUR++;
                if (me.CUR > 3) {
                    me.CUR = 1;
                }
                $el.trigger("title" + me.CUR + "_pressed");
                me.activeTitle(me.CUR);
                iAuto.Logger.log("[tabMain] go left CUR:::after", me.CUR);
                me.isdoing = true;
            }
        } catch (e) {
            iAuto.Logger.error(e.stack);
        }
    },
    _onTouchEnd: function(evt) {
        try {
            var me = this;
            if (me.scroller !== null) {
                itu.event.off(me.scroller, "scrollend");
                iAuto.Logger.log("[tabMain] _onTouchEnd scrollend disabled");
            }
        } catch (e) {
            iAuto.Logger.error(e.stack);
        }
    },
    refreshMore: function(x, y) {
        var me = this;
        var $el = me.$element;
        var contentHeight = parseInt($(".c-scroller__scroller-content").css("height"));
        var scrollerHeight = parseInt($(".c-scroller").css("height"));
        var scrollerMaxY = contentHeight - scrollerHeight;
        if (y >= scrollerMaxY && scrollerMaxY > 0) {
            iAuto.Logger.log("[tabMain]:scrollMore loading more contents... ");
            $el.trigger("loadMore", me.CUR);
        } else if (y <= 0) {
            $el.trigger("refresh", me.CUR);
            iAuto.Logger.log("[tabMain]:scrollMore refreshing more contents... ");
        }
    },
    activeTitle: function(_n) {
        var me = this;
        var $el = me.$element;
        var n = _n;
        $el.find(me.titles).removeClass(me.press);
        $(me.divs + n).addClass(me.press);
    }
});

话说这段代码的初版是很惨不忍睹的。

花了几个小时时间几近绝望,但总算hold住了。

多处参考别人的处理(有些需求或者dom没这么复杂,有些堪称lib高端大气上档次看懂都难)。

总归吸取正能量。。比如用Y和X的比例小于0.33来屏蔽一些斜向滑动。

最后控制出来的效果很满意,很有成就感。

转载于:https://www.cnblogs.com/haimingpro/p/5072631.html


http://www.niftyadmin.cn/n/934672.html

相关文章

专题图 图例_菜鸟记449有图表不用文字系列旋转角度+拼接,圆环图可以更漂亮!...

欢迎转发扩散点在看万一您身边的朋友用得着呢&#xff1f;各位朋友早上好&#xff0c;小菜继续和您分享经验之谈&#xff0c;截止今日小菜已分享400篇经验之谈&#xff0c;可以文章编号或关键词进行搜索以下才是今天的正式内容……摘要&#xff1a;本文介绍通过选择角度&#x…

mysqldump备份所有数据库,恢复单个库的场景预演

场景&#xff1a;创建两个数据库&#xff0c;每个数据库创建几张表。导出全数据库的备份&#xff0c;导入一个数据库的方式&#xff1a;---------------------------------------数据的demo--------------------------------------------------create database zsddb;use zsddb…

Mac OS X 安装教程

1&#xff09;10.8.3 http://bbs.pcbeta.com/viewthread-1317754-1-1.html 2&#xff09;10.9 http://blog.csdn.net/kissing_huo/article/details/23559239 3&#xff09;10.9.3 http://bbs.feng.com/forum.php?modviewthread&tid8656973 转载于:https://www.cnblogs.com…

JavaScript setInterval()執行clearInterval() 再恢復setInterval()

clearInterval() 方法可取消由 setInterval() 设置的 timeout。 clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。 setInterval() >clearInterval() >setTimeout() <!DOCTYPE html> <html> <head> <script src"js/jquery-1.…

在dom最前面插入_Js -- DOM操作

Ⅰ 简介当网页被加载时,浏览器会创建页面的文档对象模型&#xff08;Document Object Model&#xff09;,DOM标准规定HTML文档中的每个成员都是一个节点(node)DOM树的概念所有的标签都可以称之为是节点JavaScript 可以通过DOM创建动态的 HTML&#xff1a;JavaScript 能够改变页…

华为GVRP理解

类似于CISCO的VTP 在大型的网络中&#xff0c;华为交换机之间的串联是很普遍的。一般交换机互联端口都是配置成Trunk&#xff0c;即允许透传多个VLAN的。对于用户来说,手工配置太麻烦.一个规模比较大的网络可能包含多个VLAN.而且网络的配置也会随时发生变化,导致网络的拓扑结构…

jni补充和异常处理

为什么80%的码农都做不了架构师&#xff1f;>>> 前面基本总结了常见的一些情况&#xff0c;包括对数组&#xff0c;字符串&#xff0c;对象的处理&#xff0c;基本上满足了效果。 具体的例子都在https://git.oschina.net/xpbob/jni.git 我用的环境是mingw&#xff…

图片宽度python_第154讲 Python——用程序生成word文档

或许任何行业都免不了写word文档吧&#xff0c;我们会发现很多word文档其实都有模板&#xff0c;比如某个期刊的学术论文&#xff0c;至少从形式上格式上是有模板的。对于即将毕业的同学来说&#xff0c;写论文算是最后阶段最重要的事吧。对于企业的工作人来说&#xff0c;有些…