Js 按照MVC模式制作自定义控件

作者:ppanyong 时间:2008-10-12 12:11:00 

在web开发中常常要使用js,为了提高效率一般都会制作js的类文件。这样在使用中更新复用都很方便。下面按照我工作中的一个案例,介绍如何定义js类文件制作自定义的控件。

一、设计需求

这个需求中,我们要制作一个,从webservice上获取一组学生成绩信息,然后在页面上按照及格与否显示出来。当然还要加上一些简单的互动效果。

按照MVC的设计,我们定义M(数据模型)包括数据连接和数据的分析重组。V表现层,使用document.write的方法写页面。 C容器,控制层。将M与V联系起来。
 
他们分别命名成assessmentList(表现层),assessmentListData(数据层),assessmentListContrl(控制器)。

二、表现层

assessmentList(表现层)。根据我的需求主要有2个参数,1个是成绩的及格线,我们叫cutScore。第二个参数就是表现层的数据源,我们这里定义成一个数组Array,因为方便排序,叫scoreArray。

代码如下:


// JavaScript Document MVC - V
//自定义assessmntList对象
//该对象分3种显示状态,下载中;没有成绩单;和成绩列表
//表现层
function assessmentList(cutScore,scoreArray)
{
    this.cutScore = cutScore;//及格分数
    this.scoreArray = scoreArray;
    this.divGuid = Math.random();
    //内部方法,注意:使用this.这样的语法可以使方法私有化,成为实例方法,这样就不会出现方法被外部程序误用的事情
    this.hideDiv = function (id){
        var mydiv = document.getElementById(id);
        mydiv.style.display  = "none";
    }
    this.writeList = function (myArray,cutScore){
        var tmparray = myArray;
        tmparray.sort();
        for(var i in tmparray){
            this.addAssementItem(String("assessmentDivLists"+this.divGuid),tmparray[i],cutScore);
        }
    }
    this.showDiv = function showDiv(id){
        var mydiv = document.getElementById(id);
        mydiv.style.display  = "block";
    }
    this.addAssementItem = function (id,nu,cutScore){
        var mydiv = document.getElementById(id);
        //alert(mydiv.id)
        mydiv.innerHTML+=this.addAssementItemContent(nu,cutScore);
    }
    this.addAssementItemContent = function (nu,cutScore){
        var passstr=""
        if(Number(nu*100)>Number(cutScore)){
            passstr="pass"
        }else{
            passstr ="nopass"
        }
        var str = "<li class='"+passstr+"'>";
        str+=Math.floor(Number(nu)*100);
        str+="</li>";
        //alert(str)
        return str;
   
    }
   
};
var _assessmentList = new assessmentList();   
assessmentList.prototype.build = _bulidassessmentList;   
function _bulidassessmentList()
{
    //构造
    document.writeln("<div id="assessmentDiv"+this.divGuid+"" class="assessmentDiv"><div id="assessmentDivLoad"+this.divGuid+"" class="assessmentDivLoad" >下载成绩信息...</div><div id="assessmentDivNodata"+this.divGuid+"" class="assessmentDivNodata">这是你第一次答题。</div><div id="assessmentDivList"+this.divGuid+"" class="assessmentDivList" onMouseOver="var mydiv = document.getElementById('assessmentDivLists"+this.divGuid+"');    mydiv.style.display  = 'block';" onMouseOut="var mydiv = document.getElementById('assessmentDivLists"+this.divGuid+"');mydiv.style.display  = 'none';" style="cursor:help">成绩单</div><div id="assessmentDivLists"+this.divGuid+"" class="assessmentDivLists" ></div></div>");
    if(this.scoreArray==null){
        this.hideDiv("assessmentDivNodata"+this.divGuid);
        this.hideDiv("assessmentDivList"+this.divGuid);
    }else if(this.scoreArray.length==0){
        this.hideDiv("assessmentDivLoad"+this.divGuid);
        this.hideDiv("assessmentDivList"+this.divGuid);
        
    }else if(this.scoreArray.length>0){
        this.hideDiv("assessmentDivLoad"+this.divGuid);
        this.hideDiv("assessmentDivNodata"+this.divGuid);
        this.writeList(this.scoreArray,this.cutScore);
    }
    this.hideDiv("assessmentDivLists"+this.divGuid);
   
   
};
//
assessmentList.prototype.bulidAssessmentList = function (myArray,cutScore){
    if(myArray==null||myArray==undefined){
    }else{
        var tmparray = new Array();
        tmparray =myArray;
        tmparray.sort();
        for(var i in tmparray){
            this.addAssementItem(String("assessmentDivLists"+this.divGuid),tmparray[i],cutScore);
        }
        if(myArray.length>0){
            this.hideDiv("assessmentDivLoad"+this.divGuid);
            this.hideDiv("assessmentDivNodata"+this.divGuid);
            this.showDiv("assessmentDivList"+this.divGuid)
        }else if(myArray.length==0){
            this.hideDiv("assessmentDivList"+this.divGuid);
            this.hideDiv("assessmentDivLoad"+this.divGuid);
            this.showDiv("assessmentDivNodata"+this.divGuid)
        }
    }
}


以上代码很简单,要注意的是。assessmentList.prototype.bulidAssessmentList = function (myArray,cutScore)..这是生命了一个实例方法,主要是方便用户使用的刷新数据源的。另外,我们在document.writeln时对每个创建的div的id加了一个随机生成的数字后缀。这样做是为了避免一个页面出现2个以上的实例时,div的id不重复,div的onmouseover事件有唯一性。

其中var _assessmentList = new assessmentList(); assessmentList.prototype.build = _bulidassessmentList; 是原型扩展。这样在创建好实例后就可以通过 .build()方法初始化实例了。

标签:控件,js,类,javascript
0
投稿

猜你喜欢

  • ThinkPHP基于think-queue的队列插件实现消息推送

    2023-05-25 05:59:12
  • 慎用 script 节点的 src 属性来传递参数

    2009-11-18 12:59:00
  • sqlserver 日期比较、日期查询常用语句:月的第一天,季度的第一天等

    2010-08-01 18:58:00
  • 商品评论的设计

    2009-12-23 13:06:00
  • Javascript:keyCode键盘键码值表

    2008-02-21 13:16:00
  • JavaScript 数组的 uniq 方法

    2007-12-07 18:28:00
  • 用 JavaScript 解数学题

    2010-07-09 13:38:00
  • SQL Server数据库入门学习总结

    2012-08-21 11:01:33
  • 什么是用户体验优化(UEO)

    2008-08-27 19:49:00
  • 请谨慎对待程序的图标和名称

    2011-06-16 20:35:22
  • 适合各种浏览器的js拖动层

    2007-10-22 22:43:00
  • 如何用我的国际域名做虚拟域名?

    2010-06-16 09:53:00
  • CSS的未来:一些试验性CSS属性

    2011-06-10 13:20:00
  • ORACLE 最大连接数的问题

    2009-07-23 14:27:00
  • 微软建议的ASP性能优化28条守则(5)

    2008-02-27 13:54:00
  • MYSQL中怎样设列的默认值为Now()的介绍

    2008-11-01 16:54:00
  • ASP JSON类文件的使用方法

    2011-04-30 16:39:00
  • asp如何正确理解MIME类型?

    2010-06-28 18:21:00
  • Firebug 必须掌握的技巧

    2009-12-21 20:04:00
  • js打开新窗口方法代码收集

    2007-09-05 19:20:00
  • asp之家 网络编程 m.aspxhome.com