//原来的绑定方式
$('#' + frm_name).liteUploader({ script: url, params: { type: "image", size: size }, singleFileUploads: false }).on("lu:success", function (e, response) { var json = JSON.parse(response); return function (res) { json; }; }).on('lu:error', function (e, response) { var json = JSON.parse(response); }); $('#' + frm_name).change(function () { $(this).data("liteUploader").startUpload(); });
liteUploader插件兼容性比较好,而且很小巧,相对于某些控件可能依赖flash或者需要绑定表单,不过通常图片上传都在一个大的form做提交验证,导致form的嵌套,这时表单提交的上传插件就不使用了。
好在,liteuploader支持这个,单绑定上传的input就够了
按插件原生绑定方式,change需要独立写,而且事件等都用on链式操作(这点还可以接受)。导致插件不是整体的形式,分离了。
下面是封装写法
//使用liteUploader插件 cj.PostImagesFile = function (options) { this.setting = { url: '/api/Files/PostFile', size: '200_100', id: 'browseLogo', startUpload: function () { }, success: function () { }, error: function () { } }; $.extend(this.setting, options); this.init(); }; cj.PostImagesFile.prototype = { constructor: cj.PostImagesFile, init: function () { var _this = this; var $obj = $('#' + this.setting.id); $obj.liteUploader({ script: this.setting.url, params: { type: "image" }, singleFileUploads: false }).on("lu:success", function (e, response) { var json = JSON.parse(response); _this.setting.success(json); }).on('lu:error', function (e, response) { var json = JSON.parse(response); _this.setting.error(json); }); $obj.change(function () { $obj.data("liteUploader").startUpload(); }); } };
在原生链上,写了个init初始方法,新建对象时,会自动调用init方法,最后把on的事件,调用构造器success,error等返回结果给对外使用。
cj.PostImagesFile = new cj.PostImagesFile({ url: '/api/Files/PostFile', size: '200_100', id: 'browseLogo', startUpload: function () { }, success: function (res) { console.info(res); vm_new.logo(res.data[0]); }, error: function (res) { } });
只写了success的返回,其他方式同理。 vm_new是ko(knockout)的绑定方式
PS:这个异步不能用Promise,Promise方式resolve只能执行一次,当出现第二次上传同一个控件时,resolve就不可以执行了。
效果图