视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
快手长图怎么做 win10桌面快捷方式小箭头去除 电脑怎么在图片中做标记 abr格式文件怎么导入ps win10系统去除桌面快捷方式小箭头 怎么样才能是弥猴桃快熟 ps中怎么导入abr文件 笔记本电脑ipv6无网络访问权限 ps如何导入abr文件 win10无法去除快捷方式小箭头 电脑上显示windows许可证即将过期 ps怎样导入abr文件 win10去除快捷方式小箭头工具 电脑屏幕太亮怎样调暗一点 电脑太慢太卡怎么办 美的空调遥控器电池怎么换 如何去除快捷方式小箭头win10 电脑输入法不能转换中文怎么办 cad测量线长度快捷键 美的青春空调遥控器怎么换电池 怎么把ABR文件导入ps 在打印机怎么复印身份证正反面 怎么更换冰箱密封条 PS怎么导入ABR文件 win10完美去除快捷方式小箭头 abr文件怎么导入ps win10电脑开机怎么设置密码 自制冰棒不甜怎么弄甜 西门子冰箱冷藏室结冰怎么回事 如何去除win10快捷方式小箭头 不同手机互传怎么使用 oppo删除的照片怎么找回 西门子冰箱冷藏室结冰是什么原因 win10去除桌面快捷方式小箭头 微信如何建一个新群 冰箱制冷剂一般多久加一次 冰箱表面的保护膜需要撕掉吗 win10去除快捷方式小箭头最有效的方法 怎么用ps去水印文字 miui11桌面字体颜色设置
浏览器图片选择预览、旋转、批量上传的JS代码实现_javascript技巧
2020-11-27 21:16:49 责编:小采
文档
工作中遇到的业务场景,和同事一起研究了下,主要是为了兼容IE版本

其实就是一些琐碎的知识点在网上搜集下解决方式,然后集成了下,主要有以下点:

1. IE input type=file的图片预览要用IE的filter css

progid:DXImageTransform.Microsoft.AlphaImageLoader

chrome/firefox则用File api的file reader

2. 图片旋转,IE用progid:DXImageTransform.Microsoft.Matrix的filter(filter可以组合用,用空格隔开)

chrome/firefox用canvas

3. 上传图片,我用的都是不可见的iframe 里的form动态的添加input[type=file]去实现。chrome/firefox可以用xhr,但我懒得去修改了

4. 其中为了实现上传图片不刷新本页面,又能反复选择文件,所以还用一个iframe专门维护一个input[type=file]的列表,比较偷巧。

可以参考下代码,主要是一个主html,然后两个iframe的html,上传的服务端返回的数据为上传成功的file name,用于删除预览图。
代码如下:
// 上传回调
// resultList -> ['file1', 'file2'] 为上传成功的file name
var uploadCallback = function(resultList){
console.log(JSON.stringify(resultList));

var i = 0;
for(; i < resultList.length; i++){
var index = resultList[i].substr('file'.length);
$(':checkbox[value=' + index + ']').parent().parent().remove();
}
};

$(function(){
// 保存图片旋转的角度,以便提交给服务端处理
var rotateAng = {};
// 用于命名后缀的序号
var cc = 0;

// 如果是chrome/ff,需要用file api去生成img
var genImgTpl = function(input, index){
return '';
};

var readImgFromInput = function(_input, index){
var inputDom = _input[0];
// chrome/ff
if(inputDom['files']){
var reader = new FileReader();
reader.onload = function(e){
$('img.main:last').attr({src : e.target.result});
}
reader.readAsDataURL(inputDom['files'][0]);
}else{
var src = _input[0].value;

var imgDom = $('#img' + index);
imgDom.attr('src-old', src);
imgDom.css({
float: 'left',
position: 'relative',
overflow: 'hidden',
width: '195px',
height: '195px'
});

imgDom.css({'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='scale',src=\"" + src + "\")"});
}
};

var showImg = function(_input){
var index = ++cc;

_input.addClass('hide');
_input.attr('name', 'file' + index);
_input.attr('data-index', index);

var iframeWin = $('#choose')[0].contentWindow;
iframeWin.addInput(_input);

var tpl = '' + genImgTpl(_input, index) +
'' +
'' +
'';
$('#imgDiv').append(tpl);

readImgFromInput(_input, index);
};
var addAnother = function(){
$('#uploadBtn').before('');
};

// input[type=file]的绑定事件
$('#uploadDiv input').live('change', function(){
var path = this.value;
if(!path){
return;
}

showImg($(this));
addAnother();
});

// 可以在checkbox时候remove input
// $('#imgDiv input:checkbox').live('change', function(){
// var isChecked = $(this).is(':checked');
// console.log(isChecked);
// });

$('#imgDiv span.turn-right').live('click', function(){
// 上次旋转的角度
var index = $(this).siblings('span.choose').find('input').val();
var oldAng = rotateAng[index] || 0;
var newAng = oldAng + 90;
rotateAng[index] = newAng;

$('#img' + index).rotate(90);
});

// 表单提交时候根据checkbox,删除未choose的input[type=file]
$('#uploadBtn').click(function(){
var choosedNum = $('#imgDiv input:checkbox').filter(':checked').length;
if(!choosedNum){
alert('请选择上传文件!');
return false;
}

// 选中的序号数组
var choosedIndexList = $('#imgDiv input:checkbox').filter(':checked').map(function(){
return this.value;
}).get();

// 两个iframe,一个用于保存选择的input[type=file]
// 一个用于form upload
var uploadIframe = $('#upload')[0].contentWindow;
var chooseIframe = $('#choose')[0].contentWindow;

var i = 0;
for(; i < choosedIndexList.length; i++){
var index = choosedIndexList[i];
var inputFile = chooseIframe.$('#uploadDiv input').filter('[data-index=' + index + ']');
uploadIframe.$('#uploadForm').append(inputFile);

// 旋转度数
var ang = rotateAng[index] || 0;
if(ang % 360 != 0){
var tplInput = '';
uploadIframe.$('#uploadForm').append(tplInput);
}
}

uploadIframe.doUpload();

return false;
});
});

IE7、8、9和chrome中测试没有问题

下载本文
显示全文
专题苹果笔记本截屏的快捷键是什么苹果笔记本截屏的快捷键是什么专题iphone照片永久删除怎么恢复iphone照片永久删除怎么恢复专题废手机怎样提炼黄金废手机怎样提炼黄金专题手机卡没信号怎么回事手机卡没信号怎么回事专题电脑启动不了反复启动电脑启动不了反复启动专题iphone视频怎么转音频iphone视频怎么转音频专题qq个人文件夹中的文件被占用暂时无法登录qq个人文件夹中的文件被占用暂时无法登录专题word表格每页固定表头word表格每页固定表头专题注册微信怎么跳过辅助注册微信怎么跳过辅助专题微信收藏占用手机存储空间吗微信收藏占用手机存储空间吗专题无手机号怎么注册qq无手机号怎么注册qq专题橡胶刺鼻气味如何去除橡胶刺鼻气味如何去除专题家里的蟑螂是怎么来的家里的蟑螂是怎么来的专题怎么赶走黄鼠狼妙招怎么赶走黄鼠狼妙招专题蟑螂怎么来的蟑螂怎么来的专题相互宝怎么取消相互宝怎么取消专题相互保怎么退出相互保怎么退出专题雪是怎么形成的雪是怎么形成的专题蟑螂是怎么进入家里的蟑螂是怎么进入家里的专题洁厕灵蓝泡泡怎么用洁厕灵蓝泡泡怎么用专题如何判断面粉变质如何判断面粉变质专题房间里有老鼠用什么方法可以解决房间里有老鼠用什么方法可以解决专题家庭野生菌冷冻保存技巧家庭野生菌冷冻保存技巧专题竹荪煮多长时间熟竹荪煮多长时间熟专题老鼠胶怎么洗掉老鼠胶怎么洗掉专题怎么杀蟑螂怎么杀蟑螂专题航班号怎么看航班号怎么看专题花雕酒怎么喝花雕酒怎么喝专题板栗壳怎么好剥板栗壳怎么好剥专题烤红薯没有锡纸怎么办烤红薯没有锡纸怎么办专题