jQuery file upload cropper的 click .preview事件没有绑定成功
测试
修改https://github.com/tkvw/jQuery-File-Upload/blob/master/basic-plus.html
var node = $('<p id="chuck" class="preview"/>') .append($('<span/>').text(file.name));
给p增加id和class,在页面加载后,
打开浏览器的console,然后手动执行,然后单击图片。会发现这个事件是会触发的
$(".preview").on("click", function(){
alert("test");
})
但是jquery.fileupload-image-editor.js中的没有触发,事件应该是绑定了
手动移除事件
$(".preview").off("click"); https://stackoverflow.com/questions/209029/best-way-to-remove-an-event-handler-in-jquery
分析
1.jquery.fileupload-image-editor.js定义了uploadImageEditorPreviewSelector
uploadImageEditorPreviewSelector: 'click .preview',
2,.jquery.fileupload-ui.js中定义了filesContainer
// The container for the list of files. If undefined, it is set to
// an element with class "files" inside of the widget element:
filesContainer: undefined,
_initEventHandlers: function () {
this._super();
var handlers = {};
handlers[this.options.uploadImageEditorPreviewSelector] = this._previewHandler.bind(this);
this._on(this.options.filesContainer, handlers);
},
文件上传之后
jquery.fileupload.js中_onAdd: function (e, data) {
that._initResponseObject(newData);
that._initProgressObject(newData);
that._addConvenienceMethods(e, newData);
result = that._trigger(
'add',
$.Event('add', {delegatedEvent: e}),
newData
);
return result;
_initResponseObject: function (obj) {
var prop;
if (obj._response) {
for (prop in obj._response) {
if (obj._response.hasOwnProperty(prop)) {
delete obj._response[prop];
}
}
} else {
obj._response = {};
}
},
_initProgressObject: function (obj) {
var progress = {
loaded: 0,
total: 0,
bitrate: 0
};
if (obj._progress) {
$.extend(obj._progress, progress);
} else {
obj._progress = progress;
}
},
// Adds convenience methods to the data callback argument:_addConvenienceMethods: function (e, data) {var that = this,getPromise = function (args) {return $.Deferred().resolveWith(that, args).promise();};data.process = function (resolveFunc, rejectFunc) {if (resolveFunc || rejectFunc) {data._processQueue = this._processQueue =(this._processQueue || getPromise([this])).then(function () {if (data.errorThrown) {return $.Deferred().rejectWith(that, [data]).promise();}return getPromise(arguments);}).then(resolveFunc, rejectFunc);}return this._processQueue || getPromise([this]);};data.submit = function () {if (this.state() !== 'pending') {data.jqXHR = this.jqXHR =(that._trigger('submit',$.Event('submit', {delegatedEvent: e}),this) !== false) && that._onSend(e, this);}return this.jqXHR || that._getXHRPromise();};data.abort = function () {if (this.jqXHR) {return this.jqXHR.abort();}this.errorThrown = 'abort';that._trigger('fail', null, this);return that._getXHRPromise(false);};data.state = function () {if (this.jqXHR) {return that._getDeferredState(this.jqXHR);}if (this._processQueue) {return that._getDeferredState(this._processQueue);}};data.processing = function () {return !this.jqXHR && this._processQueue && that._getDeferredState(this._processQueue) === 'pending';};data.progress = function () {return this._progress;};data.response = function () {return this._response;};},
jquery.ui.widget.js里面的_trigger函数
this.element.trigger( event, data );
打印event
jQuery.Event {originalEvent: j…y.Event, type: "fileuploadadd", isDefaultPrevented: ƒ, timeStamp: 1561917127348, jQuery111304105261403454039: true, …}currentTarget: input#fileuploaddata: undefineddelegateTarget: input#fileuploaddelegatedEvent: jQuery.Event {originalEvent: Event, type: "change", isDefaultPrevented: ƒ, timeStamp: 33359.854999987874, jQuery111304105261403454039: true, …}handleObj: {type: "fileuploadadd", origType: "fileuploadadd", data: undefined, handler: ƒ, guid: 20, …}isDefaultPrevented: ƒ returnFalse()isTrigger: 3jQuery111304105261403454039: truenamespace: ""namespace_re: nulloriginalEvent: jQuery.Event {type: "add", delegatedEvent: j…y.Event, timeStamp: 1561917127348, jQuery111304105261403454039: true}result: undefinedtarget: input#fileuploadtimeStamp: 1561917127348type: "fileuploadadd"__proto__: Object
trigger后面的代码是
return !( $.isFunction( callback ) &&
callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
event.isDefaultPrevented() );
callback对应下面的add
// The add callback is invoked as soon as files are added to the fileupload// widget (via file input selection, drag & drop or add API call).// See the basic file upload widget for more information:add: function (e, data) {if (e.isDefaultPrevented()) {return false;}var $this = $(this),that = $this.data('blueimp-fileupload') ||$this.data('fileupload'),options = that.options;data.context = that._renderUpload(data.files).data('data', data).addClass('processing');options.filesContainer[options.prependFiles ? 'prepend' : 'append'](data.context);that._forceReflow(data.context);that._transition(data.context);data.process(function () { //这里的process是在_addConvenienceMethods里面定义的return $this.fileupload('process', data);}).always(function () {data.context.each(function (index) {$(this).find('.size').text(that._formatFileSize(data.files[index].size));}).removeClass('processing');that._renderPreviews(data);}).done(function () {data.context.find('.start').prop('disabled', false);if ((that._trigger('added', e, data) !== false) &&(options.autoUpload || data.autoUpload) &&data.autoUpload !== false) {data.submit();}}).fail(function () {if (data.files.error) {data.context.each(function (index) {var error = data.files[index].error;if (error) {$(this).find('.error').text(error);}});}});},
jquery.fileupload-ui.js里面的
_renderUpload: function (files) {return this._renderTemplate(this.options.uploadTemplate, //自己做测试的,这边是nullfiles);},
_renderTemplate: function (func, files) {if (!func) {return $(); //自己做测试,这边就返回了}var result = func({files: files,formatFileSize: this._formatFileSize,options: this.options});if (result instanceof $) {return result;}return $(this.options.templatesContainer).html(result).children();},
_forceReflow: function (node) {return $.support.transition && node.length &&node[0].offsetWidth;},
_transition: function (node) {var dfd = $.Deferred();if ($.support.transition && node.hasClass('fade') && node.is(':visible')) {node.bind($.support.transition.end,function (e) {// Make sure we don't respond to other transitions events// in the container element, e.g. from button elements:if (e.target === node[0]) {node.unbind($.support.transition.end);dfd.resolveWith(node);}}).toggleClass('in');} else { node.toggleClass('in');dfd.resolveWith(node);}return dfd;},
data.process = function (resolveFunc, rejectFunc) {if (resolveFunc || rejectFunc) {data._processQueue = this._processQueue =(this._processQueue || getPromise([this])).then(function () {if (data.errorThrown) {return $.Deferred().rejectWith(that, [data]).promise();}return getPromise(arguments);}).then(resolveFunc, rejectFunc);}return this._processQueue || getPromise([this]);};
然后跳转jquery.fileupload-ui.js里面
// Processes the files given as files property of the data parameter,// returns a Promise object that allows to bind callbacks:process: function (data) {var that = this,options = $.extend({}, this.options, data);if (options.processQueue && options.processQueue.length) {this._transformProcessQueue(options);if (this._processing === 0) {this._trigger('processstart');}$.each(data.files, function (index) {var opts = index ? $.extend({}, options) : options,func = function () {if (data.errorThrown) {return $.Deferred().rejectWith(that, [data]).promise();}return that._processFile(opts, data);};opts.index = index;that._processing += 1;that._processingQueue = that._processingQueue.then(func, func).always(function () {that._processing -= 1;if (that._processing === 0) {that._trigger('processstop');}});});}return this._processingQueue;},
// Replaces the settings of each processQueue item that// are strings starting with an "@", using the remaining// substring as key for the option map,// e.g. "@autoUpload" is replaced with options.autoUpload:_transformProcessQueue: function (options) {var processQueue = [];$.each(options.processQueue, function () {var settings = {},action = this.action,prefix = this.prefix === true ? action : this.prefix;$.each(this, function (key, value) {if ($.type(value) === 'string' &&value.charAt(0) === '@') {settings[key] = options[value.slice(1) || (prefix ? prefix +key.charAt(0).toUpperCase() + key.slice(1) : key)];} else {settings[key] = value;}});processQueue.push(settings);});options.processQueue = processQueue;},
processstart: function (e) {if (e.isDefaultPrevented()) {return false;}$(this).addClass('fileupload-processing');},
然后是jquery.fileupload-process.js里面的
_processFile: function (data, originalData) {var that = this,dfd = $.Deferred().resolveWith(that, [data]),chain = dfd.promise();this._trigger('process', null, data);$.each(data.processQueue, function (i, settings) {var func = function (data) {if (originalData.errorThrown) {return $.Deferred().rejectWith(that, [originalData]).promise();}return that.processActions[settings.action].call(that,data,settings);};chain = chain.then(func, settings.always && func);});chain.done(function () {that._trigger('processdone', null, data);that._trigger('processalways', null, data);}).fail(function () {that._trigger('processfail', null, data);that._trigger('processalways', null, data);});return chain;},
// Processes the files given as files property of the data parameter,// returns a Promise object that allows to bind callbacks:process: function (data) {var that = this,options = $.extend({}, this.options, data);if (options.processQueue && options.processQueue.length) {this._transformProcessQueue(options);if (this._processing === 0) {this._trigger('processstart');}$.each(data.files, function (index) {var opts = index ? $.extend({}, options) : options,func = function () {if (data.errorThrown) {return $.Deferred().rejectWith(that, [data]).promise();}return that._processFile(opts, data);};opts.index = index;that._processing += 1;that._processingQueue = that._processingQueue.then(func, func).always(function () {that._processing -= 1;if (that._processing === 0) {that._trigger('processstop');}});});}return this._processingQueue;},
结论
绑定事件的时候依赖于this.options.filesContainer,这玩意不存在于jquery.fileupload.js里面
_initEventHandlers: function () {this._super();var handlers = {};handlers[this.options.uploadImageEditorPreviewSelector] = this._previewHandler.bind(this);console.log(`filesContainer = ${this.options.filesContainer}`);this._on(this.options.filesContainer, handlers);},
而filesContainer在jquery.fileupload-ui.js中
// The container for the list of files. If undefined, it is set to// an element with class "files" inside of the widget element: filesContainer: undefined,_initFilesContainer: function () {var options = this.options;if (options.filesContainer === undefined) {options.filesContainer = this.element.find('.files');} else if (!(options.filesContainer instanceof $)) {options.filesContainer = $(options.filesContainer);}},
因为basic.html没有引用jquery.fileupload-ui.js,所以导致事件绑定失败。
顺便打印一下this.element
console.log(`filesContainer = ${this.options.filesContainer}`);console.log(this.element);
自己手动复制函数,然后在_initEventHandlers里面调用
_initFilesContainer: function () {var options = this.options;if (options.filesContainer === undefined) {options.filesContainer = this.element.find('.files');} else if (!(options.filesContainer instanceof $)) {options.filesContainer = $(options.filesContainer);}},_initEventHandlers: function () {this._super();this._initFilesContainer();var handlers = {};handlers[this.options.uploadImageEditorPreviewSelector] = this._previewHandler.bind(this);this._on(this.options.filesContainer, handlers);},
页面加载后,进行查询
$('#fileupload').fileupload('option', 'filesContainer')
在还有jquery.fileupload-ui.js里面还有关于uploadTemplateID的设置
options: { // By default, files added to the widget are uploaded as soon // as the user clicks on the start buttons. To enable automatic // uploads, set the following option to true: autoUpload: false, // The ID of the upload template: uploadTemplateId: 'template-upload', // The ID of the download template: downloadTemplateId: 'template-download',
转载于:https://www.cnblogs.com/chucklu/p/11111987.html
jQuery file upload cropper的 click .preview事件没有绑定成功相关推荐
- 定制jQuery File Upload为微博式单文件上传
原文链接:http://avnpc.com/pages/single-file-upload-component-by-jquery-file-upload jQuery File Upload是一个 ...
- jQuery File Upload
jQuery File Upload的最简模型 jQuery File Upload包含了一堆文件,首先需要弄清楚的是最核心的部分是哪些,根据官方的例子可以知道,一个最简单的jQuery File U ...
- jQuery File Upload文件上传
最近在写单文件上传,用jQuery File Upload踩了好多坑,但终于实现了单文件,通过按钮提交. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML ...
- php上传漏洞绕过gd库,jQuery File Upload任意文件上传漏洞
事件背景 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个JavaScript代码库(或JavaScript框架).jQuery File Upload一个jQ ...
- jquery file upload ajax上传图片 简单使用
为什么80%的码农都做不了架构师?>>> 最近要在做后台的图片上传,要用ajax异步上传图片,原生js实现很难 jquery file upload 插件很轻松就完成了 < ...
- jquery file upload 后台收到的文件名中文乱码, filename中文乱码
在jQuery File Upload.js文件里,在以下这个js中有个成员叫做 _initXHRData, 是一个function, 在这个function的最后部分有一个if-else分支,如下: ...
- jquery file upload 与 uploadify
对于图片上传来说有各种js库来帮助实现此功能,常用的包括uploadify和jquery的file upload这两个库. 1.uploadify实现起来比较简单 http://www.uploadi ...
- jquery file upload 限制上传文件的格式、大小或图片尺寸
限制文件格式.大小 $("#head").fileupload({url: "/front/user/uploadHead",dataType: 'json', ...
- 简单的python案例_基于python的最简单jQuery File Upload示例
https://github.c➜ flask-demo tree . ├── app.py ├── static │ ├── 123.txt │ └── file-upload │ ├── angu ...
- fileupload的回调方法_jQuery File Upload文件上传插件使用详解
本篇教程介绍了jQuery File Upload文件上传插件使用详解,希望阅读本篇文章以后大家有所收获,帮助大家对jQuery的理解更加深入. < jQuery File Upload 是一个 ...
最新文章
- Mac下pycharm如何安装pytorch
- docker mysql配置 丢失_Docker 从入门到掉坑
- const和define 区别
- Git教程——入门基础
- 第15组构建之法团队心得
- js 一个关于图片onload加载的事
- hdu 1233还是畅通工程 最小生成树(入门题)prim算法
- w ndoWs8pE模式下载,win7 PE
- 二叉搜索树的两种实现(数组模拟,STL)
- 最新最简单的黑苹果Mac Windows双系统教程(单双系统通用)
- 谷歌浏览器http请求出现:Provisional headers are shown 提示
- 视频切割:python将视频文件按秒存储成图片
- 360 面试 一面+二面
- 【YOLOV5-5.x 源码解读】plots.py
- 【ElectronJs】基于Electron Forge打包的一些问题汇总
- ML之FE:特征工程处理中常用的数据变换(log取对数变换等)之详细攻略
- 关于传奇皓月GOM引擎登录器配置与生成完整教程
- 删除桌面“恶意”图标
- peel在Linux生成excel,如何将多个Excel文件合并成一个且保留原有数据?
- Instagram: 从图片发布到聊天工具的蜕变