JavaScript 图片上传预览效果
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
图片上传预览是一种在图片上传之前对图片进行本地预览的技术。
.perview {width:600px;background:#fff; border-collapse:collapse;} .perview td, .perview th {padding:5px;border:1px solid #ccc;} .perview th {background-color:#f0f0f0; height:20px;} .perview a:link, .perview a:visited, .perview a:hover, .perview a:active {color:#00f;} .perview table{ width:100%;border-collapse:collapse;} 选择文件 预览图 /*file样式*/ #idpicfile { width:80px;height:20px;overflow:hidden;position:relative; background:url(http://images.cnblogs.com/cnblogs_com/cloudgamer/169629/o_addfile.jpg) center no-repeat; } #idpicfile input { font-size:20px;cursor:pointer; position:absolute;right:0;bottom:0; filter:alpha(opacity=0);opacity:0; outline:none;hide-focus:expression(this.hidefocus=true); } 选择图片: 文件路径 预览图 操作 移除 移除
【基本原理】 图片预览主要包括两个部分:从file表单控件获取图像数据,根据数据显示预览图像。 程序有以下几种预览方式: 程序定义时就自动根据浏览器设置mode属性: imagepreview.mode = $$b.ie7 || $$b.ie8 ? "filter" : $$b.firefox ? "domfile" : $$b.opera || $$b.chrome || $$b.safari ? "remote" : "simple";
调用preview方法,就会执行预览程序: if ( this.file && false !== this.oncheck() ) { this._preview( this._getdata() ); }
程序初始化时就会根据mode来设置_getdata数据获取程序: this._getdata = this._getdatafun(opt.mode);
在_getdatafun里面,根据mode返回数据获取程序: 代码 switch (mode) { case "filter" : return this._filterdata; case "domfile" : return this._domfiledata; case "remote" : return this._remotedata; case "simple" : default : return this._simpledata; }
this.file.select(); try{ return document.selection.createrange().text; } finally { document.selection.empty(); } 一般用在ie7/8,在file控件select后再通过selection对象获得文件本地路径。 domfile数据获取程序: return this.file.files[0.getasdataurl(); 用getasdataurl从file控件获取数据,这个方法暂时只有ff3支持。 远程数据获取程序: this._setupload(); this._upload && this._upload.upload(); 用_upload上传文件对象把数据提交后台,根据返回的数据再显示。 一般数据获取程序: return this.file.value; 最原始的方法,现在只有ie6还支持从file的value直接获取本地路径。 获取数据后,作为_preview预览程序的参数,再进行处理: if ( !!data && data !== this._data ) { this._data = data; this._show(); }
远程数据获取程序没有返回值,因为它需要等待返回数据,在_preview中会自动排除。
程序初始化时就会根据mode来设置_show预览显示程序: this._show = opt.mode !== "filter" ? this._simpleshow : this._filtershow;
代码 if ( !this._preload ) { var preload = this._preload = new image(), othis = this, onload = function(){ othis._imgshow( othis._data, this.width, this.height ); }; this._onload = function(){ this.onload = null; onload.call(this); } preload.onload = $$b.ie ? this._onload : onload; preload.onerror = function(){ othis._error(); }; } else if ( $$b.ie ) { this._preload.onload = this._onload; }
这里要注意ie6/7的gif图片载入bug,测试以下代码: 代码 doctype html><body><img id="img" /> </div></body>
<script> img.onload = function(){ div.innerhtml += this.complete + ", "; }; img.src = "http://tuan.pcpop.com/image/my/loading.gif"; </script>
然后设置_preload的src预载图片,如果成功预载就会执行_imgshow显示预览。 _imgshow需要三个参数,包括要预览图片的src值,图片原始宽度和图片原始高度。 代码 var img = this.img, style = img.style, ratio = math.max( 0, this.ratio ) || math.min( 1, math.max( 0, this.maxwidth ) / width || 1, math.max( 0, this.maxheight ) / height || 1 ); style.width = math.round( width * ratio ) + "px"; style.height = math.round( height * ratio ) + "px";
最后设置img的src就可以实现预览了。
remote模式会先提交file控件到后台,通过返回的数据来显示图片。 在_remotedata远程数据获取程序中,会调用_setupload来设置上传文件对象。 代码 var othis = this; this._upload = new quickupload(this.file, { onready: function(){ this.action 该文章在 2010/5/1 2:56:21 编辑过 |
关键字查询
相关文章
正在查询... |