JQuery插件:图片上传本地预览插件,改进案例一则。
/*
*名称:图片上传本地预览插件 v1.1
*作者:周祥
*时间:2013年11月26日
*介绍:基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari
*插件网站:http://keleyi.com/keleyi/phtml/image/16.htm
*参数说明: Img:图片ID;Width:预览宽度;Height:预览高度;ImgType:支持文件类型;Callback:选择文件显示图片后回调方法;
*使用方法:
<div>
<img id="ImgPr" width="120" height="120" /></div>
<input type="file" id="up" />
把需要进行预览的IMG标签外 套一个DIV 然后给上传控件ID给予uploadPreview事件
$("#up").uploadPreview({ Img: "ImgPr", Width: 120, Height: 120, ImgType: ["gif", "jpeg", "jpg", "bmp", "png"], Callback: function () { }});
*/
jQuery.fn.extend({
uploadPreview: function (opts) {
var _self = this,
_this = $(this);
opts = jQuery.extend({
Img: "ImgPr",
Width: 100,
Height: 100,
ImgType: ["gif", "jpeg", "jpg", "bmp", "png"],
Callback: function () {}
}, opts || {});
_self.getObjectURL = function (file) {
var url = null;
if (window.createObjectURL != undefined) {
url = window.createObjectURL(file);
} else if (window.URL != undefined) {
url = window.URL.createObjectURL(file);
} else if (window.webkitURL != undefined) {
url = window.webkitURL.createObjectURL(file);
}
return url;
};
_this.change(function () {
if (this.value) {
if (!RegExp("\.(" + opts.ImgType.join("|") + ")$", "i").test(this.value.toLowerCase())) {
alert("选择文件错误,图片类型必须是" + opts.ImgType.join(",") + "中的一种");
this.value = "";
if('headIconImgShow' != opts.Img) {//wuwei添加2016-03-30
$("#" + opts.Img).attr('src', "");//liuhu添加20160120
}
return false;
} //Jquery 1.3 : 1.3以后就不建议使用了:$.browser.msie && $.browser.version,你目前使用的组件里可能还有应用。
//JQuery 1.7 : 1.7
//JQuery 1.9 : 1.9之后,支持$.support.msie
//具体浏览器版本判断方案:
//http://zhidao.baidu.com/link?url=LftOa4QYHnDBuOj1HHEnUbmuIgbvd9Ka_yCKWbofx-wDw12l90lIZWn4zyQniwNOE_5vqPj-q9cqRZRFoQnL8q
//http://www.jb51.net/article/50463.htm
//http://my.oschina.net/ffwcn/blog/213708 //上边说了一大堆,浏览器版本判断来判断去,这里的代码,无非是想确定files是否被浏览器支持,就不如快刀斩乱麻,不抛异常就是支持,否则就是不支持。
try {
$("#" + opts.Img).attr('src', _self.getObjectURL(this.files[0]));
} catch (e) {
var src = "";
var obj = $("#" + opts.Img);
var div = obj.parent("div")[0];
_self.select();
if (top != self) {
window.parent.document.body.focus();
} else {
_self.blur();
}
src = document.selection.createRange().text;
document.selection.empty();
obj.hide();
obj.parent("div").css({
'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)',
'width': opts.Width + 'px',
'height': opts.Height + 'px'
});
div.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = src;
}
opts.Callback();
}
})
}
});
原作者写这个插件时,可能随手,就用了JQuery1.9的新方法$.support.msie,而我的现实情况是,项目已经用了JQuery1.7,我可不敢贸然升级到1.9(搞不好,吃不了兜着走)。
我个人推断作者的思路是,是想通过判断浏览器的类型和版本来确定是否支持input的files特性(作者说了不支持safari,当然连苹果都不发布window版的safari,还支持个毛线)。
如果是IE,是IE10及其以上版本,也支持files;是IE9及以下版本,则不支持files,调用files自然会抛出异常,通过捕获异常,采用workaroud方案绕过去。非IE,认为都是webkit,都理所当然是标准的支持files。
作者要求JQuery1.9,我们只用JQuery1.7,那就只好改写$.support.msie,网上判断IE版本的最佳方案,就是正则表达式。可问题是现在IE11之后的Edge,没准agent里已经不包含msie这个字符了,至少我用正则没进去。
干脆思路跳出来,快刀斩乱麻,参照原作者那部分的思路,管你啥版本,无非要判断浏览器是否支持files,试一下不就知道了,不抛异常就支持,否则捕获异常就按IE9下的workaround方案执行。
这样以后,管你微软出个狗屁(呵呵,我们家小点点【2岁】最近学会很爱用的骂人词)浏览器,这代码依然健壮如泰山。
JQuery插件:图片上传本地预览插件,改进案例一则。的更多相关文章
- 基于jquery实现图片上传本地预览功能
一.原理 分为两步: 当上传图片的input被触发并选择本地图片之后获取要上传的图片这个对象的URL(对象URL),把对象URL赋值给事先写好的img标签的src属性即可把图片显示出来.在这里,我们需 ...
- 图片上传本地预览。兼容IE7+
基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 预览地址:http://www.jinbanmen.com/test/1.html js代码:/**名称 ...
- uploadPreview 兼容多浏览器图片上传及预览插件使用
uploadPreview兼容多浏览器图片上传及预览插件 http://www.jq22.com/jquery-info2757 Html 代码 <div class="form-gr ...
- js实现图片上传本地预览
演示地址:https://xibushijie.github.io/static/uploadImg.html <!DOCTYPE> <html> <head> & ...
- jquery 图片上传本地预览V1.2
基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 代码进行小小的压缩 如果看源码 自己解压就行了 版本已升级 修复jquery版本问题 支持任意jqu ...
- ThinkPHP5与JQuery实现图片上传和预览效果
内容正文 这篇文章主要为大家详细介绍了thinkphp上传图片功能,和jquery预览图片效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 先上效果图: html和js代码如下: <!DO ...
- HTML5图片上传本地预览
在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 我们可以通过以下方式来解决. 获取图片 通过 File ...
- jQuery:[1]实现图片上传并预览
jQuery:[1]实现图片上传并预览 原理 预览思路 1.当上传对象的input被触发并选择本地图片之后获取要上传的图片对象的URL: 2.把对象URL赋值给实现写好的img标签的src属性 Fil ...
- JS兼容各个浏览器的本地图片上传即时预览效果
JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...
随机推荐
- windows下elasticsearch6.X安装IK分词器
文章来源:https://www.cnblogs.com/hts-technology/category/1167823.html (一)到官网下载https://github.com/medcl/e ...
- laravel的启动过程---摘自网络博客个人学习之用
如果没有使用过类似Yii之类的框架,直接去看laravel,会有点一脸迷糊的感觉,起码我是这样的.laravel的启动过程,也是laravel的核心,对这个过程有一个了解,有助于得心应手的使用框架,希 ...
- 2emq服务器压力测试(无用)
https://blog.csdn.net/frankcheng5143/article/details/52117057 1登阿里云,进入服务控制界面 https://account.aliyun. ...
- go标准库的学习-sync互斥
https://studygolang.com/pkgdoc 导入方法: import "sync" sync包提供了基本的同步基元,如互斥锁.除了Once和WaitGroup类型 ...
- geth中UTC文件与私钥的关系
在创建了自己的本地区块链后,我们会得到一个文件夹keystore,该文件夹是用来存储你在这个区块链中创建的账户的备份钥匙文件,比如在这里我有一个账户的备份钥匙文件为:UTC--2018-07-12T0 ...
- 在Eclipse中运行Web项目Jsp网页时提示端口被占用的解决办法:Several ports (8005, 8888, 8009) required by Tomcat v9.0 Server at localhost are already in use.
问题: 在Eclipse中运行Web项目Jsp网页启动Tomcat时提示端口被占用: Several ports (8005, 8080, 8009) required by Tomcat v9.0 ...
- 讲解Linux数据库安装
学习了linux这门课之后,就开始实践过程了,这样比较记得牢固,学以致用. 有了基本的命令,就可以试着安装数据库了. 企业环境 需要安装VMWare ESXi虚拟机,然后再在里面新建虚拟机. 镜像vm ...
- PAT A1124 Raffle for Weibo Followers (20 分)——数学题
John got a full mark on PAT. He was so happy that he decided to hold a raffle(抽奖) for his followers ...
- docker运行tomcat
1.下载tomcat docker pull tomcat 运行tomcat docker run -it -p 8888:8080 tomcat 查看tomcat内的文件 docker exec - ...
- QT pro文件详细写法+实例
很多的初学者都没有注意pro 文件的内容 今天简单的介绍一下 这个文件主要内容 TEMPLATE:这个变量是用来定义你的工程将被编译成什么模式.如果没有这个设置,系统将默认编译为application ...