css dhtml动态网页教程,Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例...

Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例

更新时间:2007年06月02日 00:00:00   作者:

效果DEMO:

http://www.never-online.net/tutorial/js/upload/

Javascript & DHTML 实例编程(教程)(三),初级实例篇—上传文件控件实例

上章基本上把要交代的基本知识都说了一些,今天终于开始写代码了:D

首先来做一个实例,批量上传的UI控件。以后一般做的示例也是以UI控件为主的。都是封装成Object或者用Function封装成"Class"类。

也许对于单单看前几章的朋友来说这个例子过于深奥了,但是不用担心,一步步来解释应该很快理解的,关键是理解怎么做,而不是怎么写。

如果还有不懂的朋友,可以留言给我。

首先看一个成品截图预览:

upload_preview.png

一、接下来我们先说思路,首先定义一个upload"类",

一)、这个类的公共访问信息应该有:

1、构造函数中要传递一些必要的参数,比如,在哪个容器构造upload的信息。

2、必须有一个add()方法,用于添加一个upload

3、必须有一个remove()方法,用于删除一个upload

二)、这个类中应该有一些必要的信息,是生成实例本身所具有的信息,(upload对象的一些信息)。

1、得到一共多少个upload信息,

2、一个容器对象,这个对象也是从构造函数中传递。

整个图可以简单的表示为

upload_UML.png

二、我想我们该想想应该用到哪些知识,哪些是熟悉的,哪些是未知的。

一)、正如我们上面预览图所见到的,需要三个或以上的新控件。(添加,删除,还有一个file控件,也或者还有其它的...但至少眼睛见到的就这么多了),既然是新的信息,就会可能用到document.createElement,要添加进一个容器里就可能用到object.appendChild(obj)或者obj.insertBefore()方法。删除也就是obj.parentNode.removeChild(obj)。这些上一章都已经说过了。

二)、既然是控件,肯定得用function或者是一个对象(object)封装起来,对这部分知识,第一章已经简单的说明了

三)、如何组织呢?在上面的思路中也已经有了文字和图示

接下来就动手写:

一)、构造函数,以及基本的代码(伪代码)

function upload(target/*容器*/

)

{

this._cnt = 0; /*计数器*/

this.target = document.getElementById(target);

};

upload.prototype.add = function () {

/*

*生成一个 file

*生成一个 添加

*生成一个 删除

*计数器+1

*/

};

upload.prototype.remove = function () {

/*

*删除一个 file

*删除一个 添加

*删除一个 删除

*/

};

二、写出add方法的实现

upload.prototype.add = function () {

/*

*生成一个 file

*/

var self = this; var cnt = this._cnt;

var cFile = document.createElement("input");

cFile.type="file"; cFile.name="upload";

cFile.id = "upload_file_" +cnt;

/*

*生成一个 添加

*/

var cAdd = document.createElement("span");

cAdd.innerHTML="添加";

cAdd.onclick = function () {

self.add();

};

/*

*生成一个 删除

*/

var cRemove = document.createElement("span");

cRemove.innerHTML="删除";

cRemove.onclick = function () {

self.remove(cnt);

};

cAdd.id = "upload_add_" +cnt;

cRemove.id = "upload_remove_" +cnt;

/* 把所有生成的信息添加到容器中 */

this.target.appendChild(cFile);

this.target.appendChild(cAdd);

this.target.appendChild(cRemove);

/* 计数器+1 */

this._cnt++;

return this; //返回

};

三、写出remove方法的实现

upload.prototype.remove = function (n) {

/*

*删除一个 file

*/

var a = document.getElementById("upload_file_" +n);

a.parentNode.removeChild(a);

/*

*删除一个 添加

*/

var a = document.getElementById("upload_add_" +n);

a.parentNode.removeChild(a);

/*

*删除一个 删除

*/

var a = document.getElementById("upload_remove_" +n);

a.parentNode.removeChild(a);

return this;

}

上面remove方法过于重复,可考虑重新把remove再简化,从而使我们的代码更简短而且易于维护呢?在这里,我们把这个通用功能放到一个函数里,也就是多加一个函数:

upload.prototype._removeNode = function (id) {

var a=document.getElementById(id);

a.parentNode.removeChild(a);

};

upload.prototype.remove = function (n) {

/*

*删除一个 file

*/

this._removeNode("upload_file_" +n);

/*

*删除一个 添加

*/

this._removeNode("upload_add_" +n);

/*

*删除一个 删除

*/

this._removeNode("upload_remove_" +n);

return this;

}

四、将代码组合一下,基本上可以算是完成了:D

function upload(target/*容器*/

)

{

this._cnt = 0; /*计数器*/

this.target = document.getElementById(target);

};

upload.prototype.add = function () {

/*

*生成一个 file

*/

var self = this; var cnt = this._cnt;

var cFile = document.createElement("input");

cFile.type="file"; cFile.name="upload";

cFile.id = "upload_file_" +cnt;

/*

*生成一个 添加

*/

var cAdd = document.createElement("span");

cAdd.innerHTML="添加";

cAdd.onclick = function () {

self.add();

};

/*

*生成一个 删除

*/

var cRemove = document.createElement("span");

cRemove.innerHTML="删除";

cRemove.onclick = function () {

self.remove(cnt);

};

cAdd.id = "upload_add_" +cnt;

cRemove.id = "upload_remove_" +cnt;

/* 把所有生成的信息添加到容器中 */

this.target.appendChild(cFile);

this.target.appendChild(cAdd);

this.target.appendChild(cRemove);

/* 计数器+1 */

this._cnt++;

return this; //返回

};

upload.prototype._removeNode = function (id) {

var a=document.getElementById(id);

a.parentNode.removeChild(a);

};

upload.prototype.remove = function (n) {

/*

*删除一个 file

*/

this._removeNode("upload_file_" +n);

/*

*删除一个 添加

*/

this._removeNode("upload_add_" +n);

/*

*删除一个 删除

*/

this._removeNode("upload_remove_" +n);

return this;

}

五、OK,让我们运行一下这个控件:

//这里是上面我们写的控件代码,这里由于篇幅,我就不再贴了

var o=new upload("uploadConainer");

o.add();

六、嗯,已经看到效果了吧,但似乎不太理想,全部添加的都粘在一起了,有必要要美化一下。从何处入手?这里可以有很多选择:

1、加一个换行符

2、每添加一个upload就再加一个容器div

...等

我们这里添加一个容器,如果以后还要加什么东西,会更好加一些,修改add:

upload.prototype.add = function () {

/*

*生成一个 file

*/

var self = this; var cnt = this._cnt;

var cWrap = document.createElement("div");

cWrap.id = "upload_wrap_" +cnt;

var cFile = document.createElement("input");

cFile.type="file"; cFile.name="upload";

cFile.id = "upload_file_" +cnt;

/*

*生成一个 添加

*/

var cAdd = document.createElement("span");

cAdd.innerHTML="添加";

cAdd.onclick = function () {

self.add();

};

/*

*生成一个 删除

*/

var cRemove = document.createElement("span");

cRemove.innerHTML="删除";

cRemove.onclick = function () {

self.remove(cnt);

};

cAdd.id = "upload_add_" +cnt;

cRemove.id = "upload_remove_" +cnt;

/* 把所有生成的信息添加到容器中 */

cWrap.appendChild(cFile);

cWrap.appendChild(cAdd);

cWrap.appendChild(cRemove);

this.target.appendChild(cWrap);

/* 计数器+1 */

this._cnt++;

return this; //返回

};

七、加上CSS美化一下,最后的代码如下:

html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

 upload control - http://www.never-online.net 

* { font-family:Arial; }

body { font-size:10pt; }

h1 { }

#footer { font-size:9pt; margin:20px; }

span { margin: 3px; text-decoration:underline; cursor:default; }

//

function upload(target) {

this._cnt = 0;

this.target = document.getElementById(target);

};

upload.prototype.add = function () {

var self = this; var cnt = this._cnt;

var cWrap = document.createElement("div");

cWrap.id = "upload_wrap_" +cnt;

var cFile = document.createElement("input");

cFile.type="file"; cFile.name="upload";

cFile.id = "upload_file_" +cnt;

var cAdd = document.createElement("span");

cAdd.innerHTML="添加";

cAdd.onclick = function () {

self.add();

};

var cRemove = document.createElement("span");

cRemove.innerHTML="删除";

cRemove.onclick = function () {

self.remove(cnt);

};

cAdd.id = "upload_add_" +cnt;

cRemove.id = "upload_remove_" +cnt;

cWrap.appendChild(cFile);

cWrap.appendChild(cAdd);

cWrap.appendChild(cRemove);

this.target.appendChild(cWrap);

this._cnt++;

return this;

};

upload.prototype._removeNode = function (id) {

var a=document.getElementById(id);

a.parentNode.removeChild(a);

};

upload.prototype.remove = function (n) {

this._removeNode("upload_file_" +n);

this._removeNode("upload_add_" +n);

this._removeNode("upload_remove_" +n);

return this;

};

onload = function () {

var o = new upload("container");

o.add();

};

//]]>

 batch upload control with javascript 

tutorial of DHTML and javascript programming, Power By never-online.net

相关文章

1a1b05c64693fbf380aa1344a7812747.png

无论在静态页面还是动态输出页面中window.location.href都是不错的用了跳转的实现方案2014-08-08

4f55910a645b073bc4fc65dc10dc14bd.png

javascript基础第一章 JavaScript与用户端2010-07-07

0ea3c7666119d5615e582f823fb3fad6.png

好多朋友不知道 script后面加个defer是什么意思有什么作用。2009-05-05

4f96a78db829b1556ff16de21e013c7a.png

通过元素的ID访问元素,这是DOM一个基础的访问页面元素的方法,我们要经常用到它.2009-07-07

8cc1031babc6aff2319f1c6af8544aa0.png

在JavaScript中,定义函数最常用的方法就是调用function语句。该语句是由function关键字构成的,也是很重要的函数复用。2009-09-09

0c932a99bb7b6f23c937db507070cc7b.png

你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它的存在2014-05-05

cca732bf65a93ed2ec0ac80c638460fe.png

有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物,下面是使用示例2014-05-05

2d9f31f2af7b675a3d153d2b7f1035a7.png

Javascript MD4...2006-12-12

b452cee8ec5cd9e58ab98eba17281e59.png

有时候由于我们编写js的时候不规范,造成js加密后IE会有脚本错误提示,那么我们应该如何避免这种现象产生呢?2014-11-11

f4838ec7e2d4da28e0b57d4e852dadd4.png

cancelBubble阻止事件冒泡...2006-10-10

最新评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值