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()方法初始化实例了。
猜你喜欢
- 需求背景:进行分值计算。如下图,如果只是一两个还好说,写写判断,但是如果有几十个,几百个,会不会惨不忍睹。而且,下面的还是三种情况。例如:解
- Python 功能真的很强,强大到让人吃惊,它能做的事囊括爬虫、数据分析、数据可视化、游戏等等各方面,这些功能在实际的使用中应用广泛,开发程
- 本文实例讲述了js找出5个数中最大的一个数和倒数第二大的数实现方法。分享给大家供大家参考,具体如下:最大的一个数 :方法1:<scri
- Python For 循环for 循环用于迭代序列(即列表,元组,字典,集合或字符串)。这与其他编程语言中的 for 关键字不太相似,而是更
- 在讲样式表开发管理之前,我想插播一个小知识。前几天看web标准设计组里,看到龍佑康同学问到关于 block 和 inline 的区别。记得以
- 安装环境及说明操作系统:64位win7以下所有安装包已经被我打包至网盘,请移步到http://www.colafile.com/file/4
- 目录1安装loguru|2loguru简单使用|3loguru保留日志文件|4loguru字符串输出|5loguru封装类,可以直接拿去用!
- 最近在学爬虫时发现许多网站都有自己的反爬虫机制,这让我们没法直接对想要的数据进行爬取,于是了解这种反爬虫机制就会帮助我们找到解决方法。常见的
- asp ajax json教程首先用ACCESS建json.mdb的库,然后建一个表t_jsontable,字段如下:jt_id,jt_na
- 读取excel数据需要用到xlrd模块,在命令行运行下面命令进行安装pip install xlrd表格内容大致如下,有若干sheet,每个
- 解决项目pycharm能运行,在终端却无法运行的问题报 ModuleNotFoundError: No module named '
- 场景昨天系统自动备份了某一个数据库的全部表数据,名dbAll.sql.gz。文件较大(如40G)今天因发现某一个表tableA的一条数据存在
- 本文实例为大家分享了JSP使用commons-fileupload实现文件上传代码,供大家参考,具体内容如下1、准备:将commons-fi
- 1、安装scikit-learn1.1Scikit-learn 依赖Python (>= 2.6 or >= 3.3),NumP
- 如何在页面中实现对电子信箱的访问?emaile.htm<HTML><HEAD><META NAME=
- 安装docker桌面程序从docker官网下载并安装桌面程序。安装好后启动桌面程序。若出现以下错误,说明你的docker 没有启动。1. d
- 用 ASP (using jscript) 在服务端创建 GUID 的代码如下:function GUID(){ ret
- 一.GO程序目录结构在GOPATH目录下的结构--bin(存放编译后生成的可执行文)|----hello.exe(可执行文件)--pkg(存
- 排名函数是SQL Server2005新加的功能。在SQL Server2005中有如下四个排名函数:1.row_number2.rank3
- Mysql InnoDB引擎页目录一、页目录和槽接上一篇,现在知道记录在页中按照主键大小顺序串成了单链表。那么我使用主键查询的时候,最顺其自