视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于ajaxhtml实现文件上传技巧总结
2020-11-27 19:47:32 责编:小OO
文档


这篇文章主要为大家详细总结了基于ajax html实现文件上传技巧,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

引语:大家都知道,html中上传文件就一个input,type=file就搞定了。但是,这个标签的样式,实在不值得提点什么,要改动他的样式,恐怕也是较难的。但是其实挺简单,今天就来说说上传文件小技巧吧!

1. 怎样自定义样式?
1)、只管按照自己喜欢看到的样式去定义即可,如<a href='javascript:;' class='upload-button'></a>,可以是背景图片效果,可以是文字指示,总之想怎么改怎么改!有了按钮,还需要一个文件名容器,用来存放选择上传文件时的名字,从而不让上传看起来枯涩难懂。

2)、添加真正需要上传的文件控件,并设置属性display:none;如 <input type='file' class='hide' />, 这样就有了真正的上传文件的地方了。所以,可以说,上传文件的界面有多漂亮取决你的想象力!

2. 怎样触发事件?

这是个重点,触发的点应该是自己写的样式处,而真正起作用的元素却是隐藏的,但是并不影响它的点击效果,只需要给它触发一个点击事件即可,如$('#target-file').trigger('click');

3. 多选文件?

多文件上传,只需使用html的一个file的multiple=true即可,当然你也可以选择第三方的上传控件,如swfupload,效果是真心不错的,但是对于不想用的插件的人,就不起作用了。

4. 相关插件?

界面美化其实可以使用jqueryui等插件;
要做一些友好的交互的话,都会用到ajax技术,无刷新切换、异步上传、提交,最后,其实ajax的路径也是可以保留的,使用pushState, replaceState 实现 pjax .
表单验证:validform.js
异步提交文件: jquery.form.js
友好的弹窗提示:layer.js

5. 一点兼容性的问题?

做界面方面的工作,最怕的也是很重要的工作,就是各个浏览器之间的兼容性问题,下面主要列几点供参考:

table宽度的处理方式不一致;
select, input显示高度不一致;

alert弹窗不一致;

...

6. 演示代码

<a href="javascript:;" up-type-id="1" class="btn btn-default small-btn switch-upload-method"><span>本地上传</span></a>
<a href="javascript:;" up-type-id="2" class="upload-file-instead btn btn-default small-btn switch-upload-method"><span>打包工具</span></a>
<input type="file" name="apkFiles[]" id="local-upload-real-file" class="upload-file-real hide" response-id="local-upload-container" multiple='true' />
<input type="file" name="apkToolFiles[]" id="apk-tool-real-file" class="upload-file-real hide" response-id="apk-tool-container-textarea" />
<script>
 $(function(){
 var alertTitle = '系统提示:';
 var submitId = '#do-submit';
 $('#taskForm').Validform({
 btnSubmit: submitId,
 tiptype: 1,
 ignoreHidden: true,
 dragonfly: false,
 tipSweep: true,
 label: ".label",
 showAllError: false,
 postonce: true,
 ajaxPost: true,
 datatype:{
 },
 beforeCheck:function(curform){
 },
 beforeSubmit:function(curform){
 $('.upload-file-real').attr('disabled', 'disabled');
 $(submitId).attr('disabled', 'disabled'); //提交前禁用按钮
 ajaxSubmitForm(curform);
 $(submitId).removeAttr('disabled'); //失败后恢复可提交
 return false;
 },
 submitForm: function(){} //不再起作用
 });

 //切换上传方法
 $('.switch-upload-method').off().on('click', function(){
// $(submitId).attr('disabled', 'disabled');
 var pObj = $(this).parent().find('.switch-upload-method');
 var index = pObj.index(this);
 var uploadTypeId = $('#upload-type-id').val(); //上传方式:1:打包工具;2:本地上传,0:没有上传方式
 var uploadType = $(this).attr('up-type-id');
 if(parseInt($('#sub-channel-count').html()) > 0){
 if(uploadTypeId != uploadType){
 layer.alert('还有子渠道包数据,不能完成切换,请先确认清除再切换!');
 return false;
 }
 }
 pObj.not(':eq(' + index + ')').removeClass('btn-danger').addClass('btn-default');
 pObj.eq(index).removeClass('btn-default').addClass('btn-danger');
 if(uploadType == 36){ //local-upload
 $('#upload-type-id').val(uploadType);
 $('#init-apk-container').show();
 $('#apk-tool-container').hide();
 $('#upload-main-control').find('.del-it-main').css({display: 'inline-block'});
 $('#local-upload-real-file').trigger('click');
 }else if(uploadType == 35){ //apk-tool
 $('#upload-type-id').val(uploadType);
 $('#init-apk-container').hide();
 $('#local-upload-container').hide();
 $('#upload-main-control').find('.del-it-main').hide();
 $('#apk-tool-container').show();
 }
 });
 //本地上传
 $('#local-upload-real-file').off().on('change', function(){
 if(!$(this).val()){
 return false;
 }
 file_size = 0;
 filepath = $(this).val();
 maxFileSize = 30 * 1024 * 1024;
 var browserCfg = {};
 var ua = window.navigator.userAgent;
 if (ua.indexOf("MSIE") >=1 ){
 browserCfg.ie = true;
 }else if(ua.indexOf("Firefox") >=1 ){
 browserCfg.firefox = true;
 }else if(ua.indexOf("Chrome") >=1 ){
 browserCfg.chrome = true;
 }
 if (browserCfg.ie) {
 var img = new Image();
 img.src = filepath;
 file_size = img.fileSize;
 while (true) {
 if (img.fileSize > 0) {
 if (img.fileSize > maxFileSize) {
 alert("上传包超过30MB,请使用打包工具上传!");
 return false;
 }
 break;
 }
 }
 } else {
 file_size = this.files[0].size;
 if (file_size > maxFileSize) {
 alert("上传包超过30MB,请使用打包工具上传!");
 return false;
 }
 }

 var responseObjId = $(this).attr('response-id');
 var responseObj = $('#' + responseObjId);
 $('#taskForm').ajaxSubmit({
 url:'/aa/bb/uploadTmpApk',
 resetForm: false,
 dataType: 'json',
 beforeSubmit: function(option){
 window.loading = layer.load(2);
 },
 success: function(data, statusText){
 layer.close(window.loading);
 if(data.status == 1){
 $('#version-identifier').val(data.version);
 responseObj.html(data.apkInfoHtml);
 responseObj.show();
 var delObj = $('#upload-main-control').find('.del-it-main');
 delObj.css({'display': 'inline-block'});
 $('#sub-channel-count').html(data.apkTotal);
 $('#init-apk-container').hide();
 $(submitId).removeAttr('disabled');
 }else{
 layer.alert(data.info, {title: alertTitle});
 }
 },
 error: function(data){
 layer.close(window.loading);
 layer.alert('未知错误,请稍后再试!');
 }
 });
 return false;//防止dialog 自动关闭
 });
 //打包工具
 $('#apk-tool-real-file').off().on('change', function(){
 if(!$(this).val()){
 return false;
 }
 var responseObjId = $(this).attr('response-id');
 var responseObj = $('#' + responseObjId);
 $('#Form').ajaxSubmit({
 url:'/aa/bb/uploadTmpApkTool',
 resetForm: false,
 dataType: 'json',
 beforeSubmit: function(option){
 window.loading = layer.load(2);
 },
 success: function(data, statusText){
 layer.close(window.loading);
 if(data.status == 1){
 $('#version-identifier').val(data.version);
 responseObj.html(data.infoHtml);
 var parentContainer = responseObj.parent().parent(),
 nameContainer = parentContainer.find('.apk-name-container'),
 delObj = parentContainer.find('.del-it-apk-tool');
 nameContainer.html(data.apkName);
 nameContainer.attr('title', data.apkName);
 $('#apk-tool-file-tmp').html(data.fileInfo);
 $(submitId).removeAttr('disabled');
 }else{
 layer.alert(data.info, {title: alertTitle});
 }
 },
 error: function(data){
 layer.close(window.loading);
 layer.alert('未知错误,请稍后再试!');
 }
 });
 return false;//防止dialog 自动关闭
 });
 $('.apk-tool-upload-button').on('click', function(){
 $('#apk-tool-real-file').trigger('click');
 });
 });
</script>

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在dom4j中使用XPath的简单实例

浅谈Bootstrap的DatePicker日期范围选择

用AJAX实现页面登陆以及注册用户名验证的简单实例

下载本文
显示全文
专题