JS本地图片预览
发布时间:2012-10-05 14:56:56 访问次数:8098 【关闭此页】
实现选择本地图片后预览功能,即可为网页增色不少,又能避免用户误上传。确实是一个值得推荐的功能,但是目前浏览器市场混乱,缺乏统一标准,使得这个功能在开发起来让人有够头疼。忙乎了一中午,但是结果并不乐观,只测试通过了IE6/IE7/IE8/IE9/FireFox/Chrome这几款浏览器,Opera的错误控制台不显示错误,不知道怎么搞的,所以暂时先忽略它吧。至于其它浏览器,本人电脑上没有安装。再者,就算安装更多浏览器也不可能全部兼容。
看来解决兼容问题的唯一办法就是使用Flash了。但是想用Flash实现本地图片预览功能也有很大局限性,比如网页布局、图片类型、图片尺寸限制以及上传接口等等。
贴代码的时候本来想启用在线调试功能,但是IE9对于框架内获取文件域内的地址支持的不是很好,貌似它认为有跨域嫌疑,所以只贴代码,有兴趣的童鞋复制代码自己运行测试吧,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>本地图片预览</title> <style type="text/css"> table { table-layout: fixed; } td { padding: 0 6px; font-size: 12px; } #picWrap { padding: 4px; width: 120px; height: 90px; overflow: hidden; color: #aaa; text-align: center; border: 1px solid #ddd; background-color: #f3f3f3; } </style> <script type="text/javascript"> var isIE=/msie/i.test(navigator.userAgent); var isFF=/firefox/i.test(navigator.userAgent); function getValue(o){ var str=window.webkitURL&&window.webkitURL.createObjectURL(o.files[0])||window.URL&&window.URL.createObjectURL(o.files[0])||null; if(str)return str; o.select(); o.blur(); str=document.selection.createRange().text; document.selection.empty(); return str; } function drawImg(){ var o=document.getElementById('picWrap').firstChild,picSize=document.getElementById('picSize'),W=o.offsetWidth,H=o.offsetHeight,w,h; if(arguments.length==0&&W==1&&H==1){setTimeout('drawImg()',50);return;} if(W/H>=120/90){ if(W>120){w=120,h=(H*120)/W}else{w=W,h=H} }else{ if(H>90){h=90,w=(W*90)/H}else{w=W,h=H} } picSize.innerHTML='图片实际尺寸:'+W+'×'+H; o.style.width=w+'px'; o.style.height=h+'px'; if(arguments.length==0){o.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').sizingMethod='scale'; }else{ arguments[0].width=w; arguments[0].height=h; } } function checkPic(obj){ var v=obj.value,V=getValue(obj),picWrap=document.getElementById('picWrap'),str='图 片 预 览'; document.getElementById('picSize').innerHTML=''; if(v==''){ picWrap.innerHTML=str; return; } if(/^.+\.jpg$/i.test(v.toLowerCase())){ picWrap.innerHTML=''; if(isIE){ var div=document.createElement('div'); div.style.cssText='width:1px;height:1px;margin:auto'; picWrap.appendChild(div); div.style.cssText+=";filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='image')"; try{ div.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src=V; }catch(e){ obj.outerHTML=obj.outerHTML; picWrap.innerHTML=str; alert('无效的图片文件'); return; } setTimeout('drawImg()',50); }else{ var img=new Image(); img.onload=ImgOK; img.src=V; } }else{ (isIE||window.opera)?obj.outerHTML=obj.outerHTML:obj.value=''; picWrap.innerHTML=str; alert('图片格式不正确!请选择jpg格式的文件'); } function ImgOK(){ if(img.width==0){ alert('无效的图片文件'); obj.value=''; picWrap.innerHTML=str; return; } picWrap.appendChild(img); drawImg(img); } } </script> </head> <body> <table border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td width="300" align="right"><input name="" type="file" onchange="checkPic(this)" /></td> <td id="picWrap">图 片 预 览</td> <td width="300" id="picSize"></td> </tr> </table> </body> </html>