• 组件开发小例子——网页右下角消息弹出框的实现


          前端开发小例子——网页右下角消息弹出框的实现:包括数据请求及事件功能的实现。在某个指定网页的右下角,每当刷新时,弹出提示框,若有点击“已阅”,后再刷新就不再提醒。

    效果图:

    【设计思路】

    1、创建组件:notice-sxl

    2、在notice-sxl -->package.json 中引入依赖

    3、在notice-sxl -->template -->notice-sxl.html写模板 ,使用nunjucks进行模板渲染

    4、在notice-sxl.js 中使用common-model 获取接口数据

    5、在notice-sxl -->example -->notice-sxl.html 中创建实例

    具体:

    1、创建组件:notice-sxl

        方法详见:使用SPM创建新组件

    2、在notice-sxl -->package.json 中引入依赖

       package.json:

    {
        "name": "notice-sxl",
        "version": "0.1.0",
        "root": "#",
        "description": "",
        "keywords":[],
        "homepage": "",
        "author": "sxl<sxl@strongsoft.net>",
        "main": "./src/notice-sxl.js",
        
        "repository": {
            "type": "git",
            "url": ""
        },
        "bugs": {
            "url": ""
        },
        "license": "",
        "devDependencies": {},
        "tplDependencies": {},
         "dependencies": {
            "jquery": "<=1.9",
            "backbone": "~1",
            "moment": "~2",
            "observer": "~0",
            "lodash": "~3",
            "moment": "~2",
            "nunjucks-slim":"~1.1",
            "common-model":"~0"
        },
        "scripts": {},
        "tests": ["notice-sxl"],
        "buildArgs": "cmd",
        "output": {
            "notice-sxl.js": "."
        },
        "hostModule": null,
        "assets":null,
        "options": null,
        "optionalDependencies": null
    }

    3、在notice-sxl -->template -->notice-sxl.html写模板 ,使用nunjucks进行模板渲染

    notice-sxl.html:

    <div class="message-push-box-container" id="message-push-box-{{key}}" style="bottom: {{bottom}}px">
        <div class="message_push_title" id="message_push_title">
            <div class="title_l"></div>
            <div class="title_c">
            <div class="em">事件提醒</div>
            <span>
                <a  msg="关闭" title="关闭" class="message_push_close closeIcon" key="{{key}}"></a>
            </span>
            </div>
            <div class="title_r"></div>
         </div>
    
        <div class="message_push_body" id="message_push_body">
         <div class="body_l">
           <div class="body_r">
             <div class="body_c">
                <div class="message_push_container">
                    <div class="message_push_container_content">{{content}}</div>
                    <div class="message_push_container_time">{{time}}</div>
                    <button class="message_push_container_readbtn ss-btn ss-btn-mini ss-btn-primary" key="{{key}}">标为已阅</button>
                </div>
             </div>
           </div>
         </div>
        </div>
     
       <div class="message_push_bottom">
            <div class="bottom_l"></div>
            <div class="bottom_c"></div>
            <div class="bottom_r"></div>
       </div>
    </div>

    样式:notice-sxl-theme-base.css:

    element.style {
        bottom: 30px;
    }
    .message-push-box-container {
        position:fixed;
        height: 170px;
        width: 325px;
        z-index: 9999;
        right: 10px;
        bottom: 30px;
    }
    body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
        margin: 0;
        padding: 0;
    }
    body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
        margin: 0;
        padding: 0;
    }
    
    div {
        display: block;
    }
    .message-push-box-container .message_push_title {
        height: 34px;
    }
    .message_push_title {
        position: relative;
        height: 29px;
        _bottom: -2px;
    }
    .message-push-box-container .message_push_title .title_l {
        width: 8px;
        height: 34px;
        background: url(../assets/notice-sxl/message/tilemap-legtop-left.png) no-repeat left top;
    }
    .message_push_title .title_l {
        position: absolute;
        left: 0;
        top: 0;
        width: 8px;
        height: 29px;
        overflow: hidden;
    }
    .message-push-box-container .message_push_title .title_c {
        margin: 0 12px 0 8px;
        height: 34px;
        background: url(../assets/notice-sxl/message/tilemap-legtop-center.png) repeat-x;
    }
    .message_push_title .title_c {
        position: relative;
        margin: 0 8px;
        height: 29px;
    }
    .message-push-box-container .message_push_title .title_c .em {
        height: 34px;
        line-height: 34px;
         color: #ffffff; 
        background: url(../assets/notice-sxl/message/gblb.png) no-repeat;
    }
    .message_push_title .title_c .em {
        position: absolute;
        width: 100%;
        height: 29px;
        line-height: 29px;
        font-weight: bold;
        margin-left: 3px;
        text-indent: 35px;
        font-size: 14px;
    }
    .message_push_title .title_c span {
        float: right;
        position: relative;
    }
    /*body, button, input, select, textarea {
        font-size: 12px;
        line-height: 1.5;
        font-family: tahoma,arial,Hiragino Sans GB,5b8b4f53;
    }*/
    .message-push-box-container .message_push_title .title_c  span a.closeIcon {
        width: 21px;
        height: 21px;
        background: url(../assets/notice-sxl/message/Close.gif) no-repeat;
        background-position: 50% 50%;
        margin: 6px 2px 0 0;
    }
    .message-push-box-container .message_push_title .title_c span a {
        width: 34px;
        height: 34px;
    }
    .message_push_title .title_c span a {
        float: left;
        cursor: pointer;
        width: 28px;
        height: 25px;
    }
    a:hover {
        text-decoration: underline;
    }
    .message-push-box-container .message_push_title .title_r {
        width: 12px;
        height: 34px;
        background: url(../assets/notice-sxl/message/tilemap-legtop-right.png) no-repeat right top;
    }
    .message_push_title .title_r {
        position: absolute;
        right: 0;
        top: 0;
        width: 8px;
        height: 29px;
        overflow: hidden;
    }
    .message_push_body {
        position: relative;
        overflow: hidden;
    }
    .message-push-box-container .message_push_body .body_l {
        background-image: url(../assets/notice-sxl/message/tilemap-legmid-left.png);
    }
    .message_push_body .body_l {
        overflow: hidden;
        background-repeat: repeat-y;
        background-position: left;
    }
    .message-push-box-container .message_push_body .body_r {
        background-image: url(../assets/notice-sxl/message/tilemap-legmid-right.png);
    }
    .message_push_body .body_r {
        overflow: hidden;
        background-repeat: repeat-y;
        background-position: right;
    }
    .message-push-box-container .message_push_body .body_c {
        margin: 0 12px 0 8px;
    }
    .message_push_body .body_c {
        margin: 0 8px;
        overflow: hidden;
    }
    .message-push-box-container .message_push_body .message_push_container {
        background-color: #fff;
    }
    .message-push-box-container .message_push_container {
        height: 120px;
    }
    .message-push-box-container .message_push_container_content {
        height: 89px;
        line-height: 25px;
        font-size: 14px;
        font-family: 微软雅黑;
        color: rgb(0, 52, 92);
        padding: 0px 5px;
        overflow: auto;
    }
    .message-push-box-container .message_push_container_time {
        height: 30px;
        line-height: 30px;
        font-size: 14px;
        font-family: 微软雅黑;
        color: rgb(0, 52, 92);
        text-align: right;
        padding: 4px 10px 4px 0px;
        overflow: hidden;
    }
    button.ss-btn.ss-btn-mini, input[type="submit"].ss-btn.ss-btn-mini {
    }
    button.ss-btn.ss-btn-mini, input[type="submit"].ss-btn.ss-btn-mini {
    }
    .message-push-box-container .message_push_container_readbtn {
        position: absolute;
        left: 15px;
        bottom: 5px;
        padding-left: 10px;
    }
    button.ss-btn, input[type="submit"].ss-btn {
    }
    button.ss-btn, input[type="submit"].ss-btn {
    }
    
    .ss-btn {
        border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
    }
    .ss-btn-mini {
        padding: 0 6px;
        font-size: 10.5px;
        -webkit-border-radius: 3px;
        -moz-border-radius: 3px;
        border-radius: 3px;
    }
    .ss-btn {
        display: inline-block;
        padding: 4px 12px;
        margin-bottom: 0;
        font-size: 14px;
        line-height: 20px;
        color: #333333;
        text-align: center;
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
        vertical-align: middle;
        cursor: pointer;
        background-color: #f5f5f5;
        background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
        background-repeat: repeat-x;
        border: 1px solid #bbbbbb;
        border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
        border-bottom-color: #a2a2a2;
        -webkit-border-radius: 4px;
        -moz-border-radius: 4px;
        border-radius: 4px;
        filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
        -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
        -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
        box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    }
    .ss-btn-primary {
        color: #ffffff;
        text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
        background-color: #006dcc;
        background-image: linear-gradient(to bottom, #0088cc, #0044cc);
        background-repeat: repeat-x;
        border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
        filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    }
    
    .message-push-box-container .message_push_bottom {
        height: 13px;
    }
    .message_push_bottom {
        position: relative;
        height: 8px;
        overflow: hidden;
    }
    
    .message-push-box-container .message_push_bottom .bottom_l {
        width: 8px;
        height: 13px;
        background-image: url(../assets/notice-sxl/message/tilemap-legfoot-left.png);
    }
    .message_push_bottom .bottom_l {
        font-size: 0;
        position: absolute;
        top: 0;
        left: 0;
        width: 8px;
        height: 8px;
        overflow: hidden;
        background-repeat: no-repeat;
        background-position: left bottom;
    }
    
    .message-push-box-container .message_push_bottom .bottom_c {
        margin: 0 12px 0 8px;
        height: 13px;
        background: url(../assets/notice-sxl/message/tilemap-legfoot-center.png) repeat-x;
    }
    .message_push_bottom .bottom_c {
        font-size: 0;
        position: relative;
        height: 8px;
        margin: 0 8px;
        overflow: hidden;
        background-repeat: repeat-x;
        background-position: center bottom;
    }
    
    .message-push-box-container .message_push_bottom .bottom_r {
        width: 12px;
        height: 13px;
        background-image: url(../assets/notice-sxl/message/tilemap-legfoot-right.png);
    }
    .message_push_bottom .bottom_r {
        font-size: 0;
        position: absolute;
        top: 0;
        right: 0;
        width: 8px;
        height: 8px;
        overflow: hidden;
        background-repeat: no-repeat;
        background-position: right bottom;
    }

    4、在notice-sxl -->src -->notice-sxl.js 中使用common-model 获取接口数据

    notice-sxl.js:

    var $ = require('jquery');
    /*工具类组件,同underscore*/
    var _ = require('lodash');
    /*前端mvc组件*/
    var backbone = require('backbone');
    /*模板组件*/
    var nunjucks = require('nunjucks-slim');
    /*第三方时间数据处理组件*/
    var moment = require('moment'); 
    var  CommonModel = require('common-model');
    
    //引入样式文件
    require('../css/notice-sxl-theme-base.css');
    
    var NoticeModule = backbone.View.extend({
        
        initialize: function(options) {
    
            //缓存参数
            this.options = options || {};  //这句参数相关。
            //渲染模板
            // //this.$el集成自backbone,具体参见backbone相关api
            // this.$el.html(nunjucks.render('notice-sxl.html'));
            this._initModel();
            this._initOptions();
            this._distance();//计算距离
    
        },
        events:{
           "click .message_push_close":"_bindClickClose",
           "click .message_push_container_readbtn":"_readBtnClick"
        },
        //计算距离
        _distance:function(){
               this._dialogHeight = 170;
                this._dialogBottom = 30;
                //弹框数组
                this._dialogArray = [];
        },
        _initModel:function(){
            //请求接口数据的commonModel
            this.commonModel= new CommonModel('basic.data',{isFixedStruct:true});
             //修改接口数据的commonModel(点击已阅)
            this.upEventModel= new CommonModel('basic.basicManage',{isFixedStruct:true});
        },
         _initOptions:function(){
                      //common-model实例化
                      //这是interface_common_model.json里面的接口。
                      var that = this;
                      //发起请求
                      this.commonModel.fetch({
                          basicData:{
                               params:{
                                   key: 's_comapi_event_notice',
                                   unit_id:'1090'
                                   //tic:'123'
                               }
                          }
                      },function(data){
                             //数据判断
                            var dataArr=data[0]&& data[0].length>0?data[0]:[];
                            if (!dataArr&&dataArr.length===0) {
                                return;
                            }
                              //循环遍历
                              // 1.处理
                              // 2.位置的计算
                              // 3.渲染
    
                              _.each(dataArr,function(data){
                                  data.content="已加入"+data.event_unit+"启动的紧急事件:"+data.title;
                                  data.time=moment(data.send_time).format("YYYY-MM-DD HH:mm:ss");
                                  data.id=data.id;
                                  data.bottom = that._dialogBottom;
                                  data.key=data.id;
    
                                  // 1.处理
                                  // 2.位置的计算
                                // this._dialogHeight=170;
                                // this._dialog
    
                                  // 3.渲染
                                   that.$el.append(nunjucks.render('notice-sxl.html', data));
    
                                  // var html=nunjucks.render('notice-sxl.html',data);
                                  // $("body").append(html);
                                var params = {
                                  key: data.id,
                                  bottom: that._dialogBottom
                                 };
                                that._dialogArray.push(params);
                                that._dialogBottom += that._dialogHeight;
                              });
                              // that._renderResult();      
                      });   
    // 日期格式:
    // [YYYY-MM-DDTHH:mm:ss,YYYY-MM-DDTHH:mm:ss]
    // ['2016-12-01T08:00:00,2016-12-01T22:00:00']
       },
         /**
         * 标为已读
         * @param  {[type]} e [description]
         * @return {[type]}   [description]
         */
            _readBtnClick: function(e) {
                var key = $(e.currentTarget).attr("key"); //获取得到当前的DOM对象
                key = +key;  //累加获取DOM对象的最外层
                var basicData = {
                    basicManage: {
                        params: {
                            key: "u_comapi_event_notice"
                        },
                        options: {
                            sendData: {
                                id: key,
                                time: moment().format("YYYY-MM-DDTHH:mm:ss"),
                                is_read: 1
                            },
                            method: "PUT"   //PUT方法
                        }
                    }
                };
                var that = this;
                this.upEventModel.fetch(basicData, function(data) {
                    //console.log(data);
                    that._bindClickClose(e); //点击已阅,后,则关闭消息弹出框
                });
            },
    
            //关闭消息窗口
            _bindClickClose: function(e) {
                var key = $(e.currentTarget).attr("key"); //获取得到当前的DOM对象
                var flag = 0;
                var that = this;
                _.each(this._dialogArray, function(v, k) {
                    if (!flag && v.key === +key) { //如果点击的是当前对象的关闭按钮
                        $("#message-push-box-" + v.key).remove();  //则将当前消息框移除
                        v.removeFlag = true;
                        flag = 1;
                        that._dialogBottom -= that._dialogHeight; //相对应的其余消息框往下堆叠
                    }
                    if (flag) {  //消息框的堆叠效果
                        that._boxAnimate(v, that);
                    }
                });
                this._dialogArray = _.filter(this._dialogArray, function(v) {
                    return !v.removeFlag;    //消息框关闭成功的话,从后台数据库缓存中移除相关记录
                });
            },
            //box下降的动画效果
            _boxAnimate: function(v, that) {
                $("#message-push-box-" + v.key).animate({
                    bottom: v.bottom - that._dialogHeight
                }, 500, function() {
                    v.bottom = v.bottom - that._dialogHeight;
                });
            },
        render: function() {
            //this._renderResult();
        },
    
        /**
         * 渲染结果
         */
        _renderResult: function(   ) {
    
            //var datas = this.options.datas || [];
            /*var result = {
                datas: datas
            };*/
            //this.$el.html(nunjucks.render('notice-sxl.html', result));
        },
    
        dispose: function() {
    
            //继承自backbone
            this.remove();
        }
    });
    
    module.exports = NoticeModule;

    5、在notice-sxl -->example -->index.html 中创建实例

    index.html :

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>
            消息提醒
        </title>
        <link rel="stylesheet" type="text/css" href="">
    </head>
    <body>
    <script id="seajsnode" src="../sea-modules/sea.js"></script>
    <script src="../sea-modules/seajs-helper.js"></script>
    
    <script>
        seajs.use(['../dist/notice-sxl-debug','jquery'],function(NoticeSxl,$){
            //TODO 示例代码
            var main =  new NoticeSxl({el:'body'});
            main.render();
        });
    </script>
    
    </body>
    </html>

    6. 使用spm引入依赖,以及编译和运行:

       

    步骤如下:

    1)安装依赖:spm install -e

    2)编译:spm build

        (编译好的东西会放在trunk-dist里面)

    3)发布:spm app -d

    (会出来一个export端口,一般是:4745)

    4)在浏览器中输入:http://localhost:4745/examples/index.html  即可运行

    如果出错了,出bug了,修改完,重新操作2)步骤。

  • 相关阅读:
    微信h5下拉隐藏网页,还有取消页面滑动
    vuejs中使用递归嵌套组件
    运行gitbook init命令报错及问题解决办法
    利用python生成gitbook目录文件
    通过Appium日志,分析其运行原理
    字符串两两更换位置
    Dockerfile启动的程序,内存不断增长问题
    测试流程优化
    APP测试面试题(一)
    关于面试总结13-app测试面试题
  • 原文地址:https://www.cnblogs.com/shenxiaolin/p/6170297.html
Copyright © 2020-2023  润新知