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


Posted in Javascript onJune 02, 2007

效果DEMO:
http://www.never-online.net/tutorial/js/upload/
Javascript & DHTML 实例编程(教程)(三),初级实例篇—上传文件控件实例
上章基本上把要交代的基本知识都说了一些,今天终于开始写代码了:D
首先来做一个实例,批量上传的UI控件。以后一般做的示例也是以UI控件为主的。都是封装成Object或者用Function封装成"Class"类。

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

如果还有不懂的朋友,可以留言给我。
首先看一个成品截图预览:

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

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

一)、这个类的公共访问信息应该有:
1、构造函数中要传递一些必要的参数,比如,在哪个容器构造upload的信息。
2、必须有一个add()方法,用于添加一个upload
3、必须有一个remove()方法,用于删除一个upload

二)、这个类中应该有一些必要的信息,是生成实例本身所具有的信息,(upload对象的一些信息)。
1、得到一共多少个upload信息,
2、一个容器对象,这个对象也是从构造函数中传递。

整个图可以简单的表示为

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

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

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

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

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

接下来就动手写:
一)、构造函数,以及基本的代码(伪代码)

<script>
function upload(target/*容器*/
                )
{
  this._cnt = 0; /*计数器*/
  this.target = document.getElementById(target);
};

upload.prototype.add = function () {
  /*
   *生成一个 file
   *生成一个 添加
   *生成一个 删除
   *计数器+1
   */
};

upload.prototype.remove = function () {
  /*
   *删除一个 file
   *删除一个 添加
   *删除一个 删除
   */
};
</script>

二、写出add方法的实现

<script>
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; //返回
};
</script>

三、写出remove方法的实现

<script>
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;
}
</script>

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

<script>
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;
}
</script>

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

<script>
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;
}
</script>

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

<html>
<head>
<script>
//这里是上面我们写的控件代码,这里由于篇幅,我就不再贴了
</script>
</head>
<body>
<div id="uploadContainer"></div>
<script>
var o=new upload("uploadConainer");
o.add();
</script>
</body>
</html>

六、嗯,已经看到效果了吧,但似乎不太理想,全部添加的都粘在一起了,有必要要美化一下。从何处入手?这里可以有很多选择:
1、加一个换行符<br>
2、每添加一个upload就再加一个容器div
...等

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

<script>
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; //返回
};
</script>

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title> upload control - http://www.never-online.net </title>
 <style type="text/css" media="all" title="Default">
      * { font-family:Arial; }
      body { font-size:10pt; }
      h1 { }
      #footer { font-size:9pt; margin:20px; }
      span { margin: 3px; text-decoration:underline; cursor:default; }
 </style>
 <script type="text/javascript">
 //<![CDATA[

    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();
    };
 //]]>
 </script>
 </head>
 <body id="www.never-online.net">
    <h1> batch upload control with javascript </h1>
    <div id="container"></div>
    <div id="footer">tutorial of DHTML and javascript programming, Power By never-online.net</div>
 </body>
</html>

Javascript 相关文章推荐
List all the Databases on a SQL Server
Jun 21 Javascript
Prototype使用指南之selector.js说明
Oct 26 Javascript
Node.js实战 建立简单的Web服务器
Mar 08 Javascript
一行命令搞定node.js 版本升级
Jul 20 Javascript
jQuery中:submit选择器用法实例
Jan 03 Javascript
浅谈JavaScript事件的属性列表
Mar 01 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
学习JavaScript设计模式之代理模式
Jan 12 Javascript
新手学习前端之js模仿淘宝主页网站
Oct 31 Javascript
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
Nov 11 Javascript
vue组件vue-esign实现电子签名
Apr 21 Vue.js
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
Jun 02 #Javascript
Javascript &amp; DHTML 实例编程(教程)基础知识
Jun 02 #Javascript
把JS与CSS写在同一个文件里的书写方法
Jun 02 #Javascript
JavaScript 不只是脚本
May 30 #Javascript
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
May 30 #Javascript
[原创]站长必须要知道的javascript广告代码
May 30 #Javascript
JSON 学习之完全手册 图文
May 29 #Javascript
You might like
PHP5 的对象赋值机制介绍
2011/08/02 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
python多线程扫描端口(线程池)
2019/09/04 Python
python的slice notation的特殊用法详解
2019/12/27 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
大学新生军训个人的自我评价
2013/10/03 职场文书
实习鉴定评语
2014/01/19 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
活动总结报告格式
2014/05/09 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
单位车辆管理制度
2015/08/05 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS