一个简单的backbone实例(基于139邮箱)

先看一下效果图:

代码如下:

<!doctype html>
<html lang="en">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>邮箱前端实现</title>
  <style type="text/css">

        *{
            margin:0px;
            padding:0px;
        }
        
        .main{
            margin:20px 30px;
            text-align:center;
            line-height:30px;
        }

        .left{
            350px;
            height:450px;
            margin-top:30px;
        }

        .right{
            600px;
            height:700px;
            margin-left:400px;
            margin-top:-480px;
        }

        .bottom{
            border:1px solid #eee;
            100%;
            text-align:left;
        }

        #folderList li{
            list-style: none;
        }

        #emailList li{
            list-style: none;
        }

        #contentList li{
            list-style: none;
        }

        .on{
            background-color:#ccc;
        }

        #page{
            text-align: right;
            margin-right: 30px;
        }
        #page a{
            text-decoration:none;
        }
  </style>
 </head>
 <body>
      
      <div class="main" name="main">
          <div class="left" name="left" id="left">
                <ul id="folderList"></ul>
          </div>
          <div class="right" name="right" id="right">
                <div id="page">
                    <a id="previous" href="javascript:void(0);">上一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
                    <a id="behind" href="javascript:void(0);">下一页</a>
                </div>
                <ul id="emailList"></ul>
          </div>
          <div class="bottom" name="bottom" id="bottom">
                <ul id="contentList"></ul>
          </div>
      </div>
 </body>

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="underscore.js"></script>
<script type="text/javascript" src="backbone.js"></script>

 <script type="text/javascript">
        Model = Backbone.Model.extend({
            initialize: function(){
                //alert('Hey, you create me!');
            },
            defaults: {
                pageIndex : 1,
                fid : -1,
                mid : -1
            },
            start : 1,  //邮件开始
            total : 20,  //每页显示多少封邮件
            firstAddFolder : true,  //判断是否是第一次加载文件夹
            firstAddTitle : true,  //判断是否是第一次加载邮件列表
            getResult : function(options){
                $.ajax({
                    url : options.url,
                    dataType : "json", //返回的数据类型,text 或者 json数据,建议为json
                    type : "post", //传参方式,get 或post
                    data : options.data, //传过去的参数,格式为 变量名:变量值
                    error : function(msg){  //若Ajax处理失败后回调函数,msg是返回的错误信息
                        //alert( "Ajax跳转处理失败");
                        //console.log(msg);
                        options.error(msg.responseText);
                    },
                    success: function(text) { //若Ajax处理成功后的回调函数,text是返回的信息
                        //alert("Ajax处理已成功:" + text);
                        //console.log(text);
                        options.success(text.responseText);
                    }
                });
            }
        });

        //文件夹列表视图
        ViewLeft = Backbone.View.extend({
            el: $("#left"),
            initialize: function (options) {  //初始化
                //this.model = options.model;
                this.viewRight = options.viewRight;
                this.bindFidChangeEvent();
            },
            events: {
                "click #folderList li a": "checkIn", //事件绑定,给a标签绑定点击事件
            },

            checkIn: function(event){
                var target = $(event.target);
                var fid = target.attr("fid");  //获取被点击的元素的fid
                this.model.set("fid",fid);
                target.parent().parent().find("li").removeClass("on");  //清除其余的.on
                target.parent().addClass("on");  //给被点击的对象绑定.on
            },

            autoClick : function(){  //主动触发点击事件
                $("#folderList li:first a").click();
            },

            bindFidChangeEvent: function () {
                var self = this;
                self.model.on("change:fid", function(){  //给fid绑定监听事件
                    self.model.firstAddTitle = true;
                    self.model.start = 1;
                    if(self.model.get("pageIndex")>1){
                        self.model.set("pageIndex",1);
                    }else{
                        self.viewRight.getEmailTitle(self.model.get("fid"));
                    }
                });
                self.model.on("change:pageIndex", function(){  //给pageIndex绑定监听事件
                    self.model.firstAddTitle = true;
                    self.viewRight.getEmailTitle(self.model.get("fid"));
                });
            },

            //获取文件夹列表
            getFolder : function(){
                var self = this;
                var sid = location.href.match(/sid=([^?#&]*)[?#&]?/)[1];
                var data = [ '<object>',
                               '<int name="stats">1</int>',
                               '<int name="type">0</int>',
                               '<int name="command">1</int>',
                             '</object>'].join("");
                var options = {};
                options.url = "http://appmail.mail.10086.cn/s?func=mbox:getAllFolders&sid="+sid;

                options.data = data;
                options.success = function(result){
                    console.log(result);
                };
                options.error = function(result){
                    //console.log('邮件列表:'+result);
                    var resultData = eval("(" + result + ")");
                    var array = resultData.var;
                    $("#folderList").html('');
                    _.each(array, function(item){
                        var html = '<li><a messageCount="' + item.stats.messageCount + '" fid="' + item.fid + '" href="javascript:void(0);">' + item.name + '</a></li>';
                        $("#folderList").append(html);
                    });
                    if(self.model.firstAddFolder){
                        self.autoClick();
                        self.model.firstAddFolder = false; 
                    }
                };

                this.model.getResult(options);
            }
            
        });

        //邮件列表视图
        ViewRight = Backbone.View.extend({
            el: $("#right"),
            initialize: function () {  //options 可以传也可以不传
                //this.model = options.model;
                this.viewBottom = new ViewBottom();
                this.bindMidChangeEvent();
            },
            events: {
                "click #emailList li a": "checkIn", //事件绑定,绑定Dom中id为**的元素
                "click #previous" : "previous",
                "click #behind" : "behind",
            },
            checkIn: function(event){
                var target = $(event.target);
                var mid = target.attr("mid");
                var fid = target.attr("fid");
                this.model.set("mid",mid);
                target.parent().parent().find("li").removeClass("on");
                target.parent().addClass("on");
            },

            previous: function(){
                var self = this;
                
                if(self.model.get("pageIndex")<2){
                    alert("您好!已经到第一页了");
                }else{
                    self.model.start = (self.model.get("pageIndex")-2)*(self.model.total)+1;
                    self.model.set("pageIndex",self.model.get("pageIndex")-1);
                }
            },

            behind: function(){
                var self = this;
                self.model.start = (self.model.get("pageIndex"))*(self.model.total)+1;
                self.model.set("pageIndex",self.model.get("pageIndex")+1);
            },

            autoClick : function(){
                $("#emailList li:first a").click();
            },
            bindMidChangeEvent: function () {
                var self = this;
                self.model.on("change:mid", function(){
                    self.viewBottom.getEmailContent(self.model.get("fid"),self.model.get("mid"));
                });
            },
            //获取邮件列表
            getEmailTitle : function(fid){
                var self = this;
                var sid = location.href.match(/sid=([^?#&]*)[?#&]?/)[1];
                var data = [ '<object>',
                               '<int name="fid">' + fid + '</int>',
                               '<string name="order">receiveDate</string>',
                               '<string name="desc">1</string>',
                               '<int name="start">' + self.model.start + '</int>',
                               '<int name="total">' + self.model.total + '</int>',
                               '<string name="topFlag">top</string>',
                               '<int name="sessionEnable">2</int>',
                             '</object>'].join("");
                var options = {};
                options.url = "http://appmail.mail.10086.cn/s?func=mbox:listMessages&sid="+sid;

                options.data = data;
                options.success = function(result){
                    console.log(result);
                };
                options.error = function(result){
                    //console.log('邮件标题:'+result);
                    var resultData = eval("(" + result + ")");
                    var array = resultData.var;
                    $("#emailList").html('');
                    _.each(array, function(item){
                        //console.log(item.name);
                        var html = '<li><a fid="' + item.fid + '" mid="' + item.mid + '" href="javascript:void(0);">' + item.subject + '</a></li>';
                        $("#emailList").append(html);
                    });
                    if(self.model.firstAddTitle){
                        self.autoClick();
                        self.model.firstAddTitle = false; 
                    }
                };

                this.model.getResult(options);
            }
            
        });

        //邮件内容视图
        ViewBottom = Backbone.View.extend({
            el: $("#bottom"),
            initialize: function () {
                this.model = new Model;
            },
            events: {
                //"click #left": "checkIn", //事件绑定,绑定Dom中id为left的元素
            },
            //获取邮件内容
            getEmailContent : function(fid,mid){
                var sid = location.href.match(/sid=([^?#&]*)[?#&]?/)[1];
                var data = '';
                var options = {};
                options.url = "http://appmail.mail.10086.cn/RmWeb/view.do?func=view:readMessage&comefrom=54&sid="+sid+"&mid="+mid+"&callback=readMailReady&fid="+fid+"";

                options.data = data;
                options.success = function(result){
                    console.log(result);
                };
                options.error = function(result){
                    //console.log('邮件内容:'+result);
                    $("#contentList").html('');
                    $("#contentList").append(result);
                };

                this.model.getResult(options);
            }
            
        });
        //实例化Model、ViewRight、ViewLeft
        var model = new Model();
        var viewRight = new ViewRight({model : model});
        var viewLeft = new ViewLeft({model : model, viewRight : viewRight});
        viewLeft.getFolder();
 </script>

</html>

只要再引入jquery.min.js、underscore.js、backbone.js。然后用fiddler挂载这几个文件,从139邮箱登陆页登陆进去即可看到效果。

悟已往之不谏,知来者之可追;实迷途其未远,觉今是而昨非。 ——且行且珍惜
原文地址:https://www.cnblogs.com/jq-melody/p/3890402.html