zoukankan      html  css  js  c++  java
  • Silence.js高效开发移动Web前端类库

    基于Zepto的轻量级移动Web前端JavaScript类库。

    编写这个类库原因及目的:

    • 采用MVC设计模式,使代码工程化结构化。
    • 使用RouterJS,提升前端交互性能,延长页面使用时间,并通过Ajax实现交互,避免页面跳转的交互中断糟糕体验。
    • 使用LocalStorage前端离线缓存,实现缓存时间有效期,从而带给用户极致的响应效率。
    • 基于ZetpoJS,移动端的JQuery,兼容JQuery大部分语法,体积更小,效率更高。
    • 基于Touch.js,支持移动端触摸事件('swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown','doubleTap', 'tap', 'singleTap', 'longTap'),并避免click事件移动端延时300ms的恶心效果。

    Zepto的设计目的是提供 jQuery 的类似的API,但并不是100%覆盖 jQuery 。Zepto设计的目的是有一个5-10k的通用库、下载并快速执行、有一个熟悉通用的API,所以你能把你主要的精力放到应用开发上。

    Zepto模块:

    moduledefaultdescription
    zepto 核心模块;包含许多方法
    event 通过on()off()处理事件
    ajax XMLHttpRequest 和 JSONP 实用功能
    form 序列化 & 提交web表单
    ie 增加支持桌面的Internet Explorer 10+和Windows Phone 8。
    detect   提供 $.os和 $.browser消息
    fx   The animate()方法
    fx_methods   以动画形式的 showhidetoggle, 和 fade*()方法.
    assets   实验性支持从DOM中移除image元素后清理iOS的内存。
    data   一个全面的 data()方法, 能够在内存中存储任意对象。
    deferred   提供 $.Deferredpromises API. 依赖"callbacks" 模块. 
    当包含这个模块时候, $.ajax() 支持promise接口链式的回调。
    callbacks   为"deferred"模块提供 $.Callbacks
    selector   实验性的支持 jQuery CSS 表达式 实用功能,比如 $('div:first')el.is(':visible')
    touch   在触摸设备上触发tap– 和 swipe– 相关事件。这适用于所有的`touch`(iOS, Android)和`pointer`事件(Windows Phone)。
    gesture   在触摸设备上触发 pinch 手势事件。
    stack   提供 andSelfend()链式调用方法
    ios3   String.prototype.trim 和 Array.prototype.reduce 方法 (如果他们不存在) ,以兼容 iOS 3.x.

    Zepto插件编写规范:

    1 ;(function($){
    2   $.extend($.fn, {
    3     foo: function(){
    4       // `this` refers to the current Zepto collection.
    5       // When possible, return the Zepto collection to allow chaining.
    6       return this.html('bar')
    7     }
    8   })
    9 })(Zepto)

    RouterJS使用API编写:

    html编写

    viewport适应移动端浏览器,页面必须引入div id="container"容器,并且引入routerJS库。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
        <title>example</title>
    </head>
    <body>
        <div id="container"></div>
        <script src="router.js"></script>
    </body>
    </html>

    javascript编写

     1 var router = new Router({
     2     container: '#container'
     3 });
      //无参数页面
    4 var home = { 5 url: '/', 6 className: 'home', 7 render: function (){ 8 return '<h1>home</h1>'; 9 } 10 };
      //带参数的页面
    11 var post = { 12 url: '/post/:id', 13 className: 'post', 14 render: function (){ 15 var id = this.params.id; 16 return '<h1>post</h1>'; 17 } 18 };
      //创建路由关系,并定义默认页面
    19 router.push(home).push(post).setDefault('/').init();

    new Router参数 option 是可选的,下面是该参数可选的属性。

    属性类型默认值描述
    container String '#container' container 容器的选择器
    enter String 'enter' 该页面出现时添加的类名,enterTimeout 为 0 时会被忽略
    enterTimeout Number 0 在这个时间之后移除添加的 enter 类名
    leave String 'leave' 该页面离开时添加的类名,lieaveTimeout 为 0 时会被忽略
    leaveTimeout Number 0 在这个时间之后移除该页面的 DOM

    push添加路由页面的配置。下面是 route 参数的属性。

    属性类型描述
    url String 以 / 开头的 url,会体现在 hash,支持参数,如:/user/:userId/post/:posdId
    className String 可选,该页面可以添加的额外类名,以便控制该页面下的样式
    render function 页面渲染方法,支持同步和异步, 可以直接返回 html 字符串,可以返回 promise 对象,也可以接收 callback 参数
    bind function 执行绑定事件的方法,this 指向当前页面容器

     本地缓存API编写:

     1 /**
     2  * User: Sparkfly
     3  * Date: 16-5-31
     4  * Time: 下午11:33
     5  * 前端缓存驱动,基于localStorage缓存对象
     6  */
     7 
     8 ;(function(){
     9     //缓存队列
    10     var _local_storage = [];
    11     var __key__ = "local_storage";
    12 
    13     var start_cache = function(){
    14         var storage_str = localStorage.getItem(__key__);
    15         if(storage_str==null){
    16             _local_storage = [];
    17         }else{
    18             _local_storage = JSON.parse(storage_str);
    19         }
    20         return true;
    21     }
    22 
    23     var end_cache = function(){
    24         var storage_str = JSON.stringify(_local_storage);
    25         localStorage.setItem(__key__,storage_str);
    26         return true;
    27     }
    28 
    29     //添加缓存
    30     var set_cache = function(_key,_element,_expires){
    31         var _current_timestamp_ = (new Date()).valueOf();
    32         start_cache();
    33         _local_storage.push({
    34             key:_key,
    35             element:_element,
    36             expires: ( _current_timestamp_ + parseInt(_expires) * 1000 )
    37         });
    38         end_cache();
    39         return true;
    40     }
    41 
    42     //获取缓存
    43     var get_cache = function(_key){
    44         var _result_ = null;
    45         return _result_;
    46         var _current_timestamp_ = (new Date()).valueOf();
    47         start_cache();
    48         var __item__ = null;
    49         $.each(_local_storage,function(index,item){
    50             if(item.key == _key){
    51                 __item__ = item;
    52             }
    53         });
    54         if(__item__ != undefined && __item__ != null){
    55             if(__item__['expires'] != undefined && __item__['expires'] > _current_timestamp_){
    56                 _result_ =  __item__['element'];
    57             }else if(__item__['expires'] != undefined){
    58                 //移除缓存
    59                 var __storage__ = [];
    60                 $.each(_local_storage,function(index,item){
    61                     if(item.key != _key){
    62                         __storage__.push(item);
    63                     }
    64                 });
    65                 _local_storage = __storage__;
    66             }
    67         }
    68         end_cache();
    69         return _result_;
    70     }
    71 
    72     //删除缓存
    73     var delete_cache = function(_key){
    74         start_cache();
    75         var __storage__ = [];
    76         $.each(_local_storage,function(index,item){
    77             if(item.key != _key){
    78                 __storage__.push(item);
    79             }
    80         });
    81         _local_storage = __storage__;
    82         start_cache();
    83     }
    84 
    85     var clear_cache = function(){
    86         _local_storage = [];
    87         start_cache();
    88     }
    89 
    90     //缓存对象
    91     var fast_cache = {
    92         set_cache:set_cache,
    93         get_cache:get_cache,
    94         del_cache:delete_cache,
    95         clear:clear_cache
    96     };
    97     $.extend($.fn,{FAST_CACHE:fast_cache});
    98 
    99 })(Zepto)

    控制器API编写:

     1 /**
     2  * Created with JetBrains PhpStorm.
     3  * User: Sparkfly
     4  * Date: 16-5-30
     5  * Time: 下午11:12
     6  * To change this template use File | Settings | File Templates.
     7  */
     8 ;(function(){
     9     $.extend($.fn,{ controller:{
    10         _key_index:1,
    11         controller_lists:[],
    12         add:function(_item,_index){
    13             var self = this;
    14             (_index == undefined)?
    15                 _index=self._key_index++:_index=_index;
    16             self.controller_lists.push(_item);
    17         },
    18         remove:function(_index){
    19             //移除controller
    20         },
    21         search:function(_index){
    22             //获取controller
    23         },
    24         init_router:function(_router,_link){
    25             var self = this;
    26             $.each(self.controller_lists,function(_index,_item){
    27                 _router.push(_item);
    28             });
    29             _router.setDefault(_link).init();
    30         }
    31     }
    32     });
    33 })(Zepto)

    index.html

    支持微信JSJDK服务方式

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
     6     <title>首 页</title>
     7     <link rel="stylesheet" href="./lib/style/weui.min.css"/>
     8     <link rel="stylesheet" href="./lib/style/example.css"/>
     9     <link rel="stylesheet" href="./lib/style/style.css"/>
    10 
    11     <link rel="stylesheet" href="./lib/style/dropload.css"/>
    12     <script>
    13         /*全局定义 start */
    14         var globals = {
    15             WX_JS_JDK_CONFIG : {
    16 
    17             },
    18             IS_WX_BROWSER : function(){
    19                 //是否属于微信浏览器
    20                 return true;
    21             },
    22             IN_VERSION : "1.0"
    23         };
    24         /*全局定义 end   */
    25     </script>
    26 </head>
    27 <body ontouchstart>
    28 <div class="container js_container" id="main_container">
    29     <!-- container html -->
    30 </div>
    31 <!-- core start -->
    32 <script src="./core/zepto.min.js"></script>
    33 <script src="./core/router.min.js"></script>
    34 
    35 <script src="./core/touch.js"></script>
    36 <script src="./core/cache.js"></script>
    37 <script src="./core/dialog.js"></script>
    38 <script src="./core/Silence.js"></script>
    39 <script src="./core/controller.js"></script>
    40 
    41 <!-- core end   -->
    42 
    43 <!-- lib start -->
    44 <script src="./lib/script/swipeSlide.js"></script>
    45 <script src="./lib/script/dropload.js"></script>
    46 <!-- lib end -->
    47 
    48 <!-- controller js start -->
    49 <script src="./view/weui/weui_home.js"></script>
    50 <script src="./view/weui/weui_button.js"></script>
    51 
    52 <script>
    53     $.fn.controller.init_router(
    54             $.fn.pageManager({
    55                 container: '#main_container',
    56                 enterTimeout: 250,
    57                 leaveTimeout: 250
    58             }),"/"
    59     );
    60 </script>
    61 <!-- controller js end   -->
    62 </body>
    63 </html>

    演示地址:

      Silence.js类库演示

    github路径:

      https://github.com/helingfeng/fastU

     作为前端的初学者,第一次写类库,虽然结果并不理想,但我会不断学习新知识,然后在review和重构代码,希望,最后能把它做得更好。

  • 相关阅读:
    Spring-boot内置的程序管理监控工具-Actuator
    分表工具类(根据唯一字符串)
    ES设计及规范
    测试单元Junit一直进不去@test方法解决方案
    MAC OS怎样将普通成员升级为管理员
    elasticSearch小结
    Mysql 查询条件中字符串尾部有空格也能匹配上的问题
    gitlab进行meger代码回滚
    ES与关系型数据库的通俗比较
    kafka的生产者配置以及发送信息的三种方式
  • 原文地址:https://www.cnblogs.com/helingfeng/p/5562000.html
Copyright © 2011-2022 走看看