测试

修改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事件没有绑定成功相关推荐

  1. 定制jQuery File Upload为微博式单文件上传

    原文链接:http://avnpc.com/pages/single-file-upload-component-by-jquery-file-upload jQuery File Upload是一个 ...

  2. jQuery File Upload

    jQuery File Upload的最简模型 jQuery File Upload包含了一堆文件,首先需要弄清楚的是最核心的部分是哪些,根据官方的例子可以知道,一个最简单的jQuery File U ...

  3. jQuery File Upload文件上传

    最近在写单文件上传,用jQuery File Upload踩了好多坑,但终于实现了单文件,通过按钮提交. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML ...

  4. php上传漏洞绕过gd库,jQuery File Upload任意文件上传漏洞

    事件背景 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个JavaScript代码库(或JavaScript框架).jQuery File Upload一个jQ ...

  5. jquery file upload ajax上传图片 简单使用

    为什么80%的码农都做不了架构师?>>>    最近要在做后台的图片上传,要用ajax异步上传图片,原生js实现很难 jquery file upload 插件很轻松就完成了 < ...

  6. jquery file upload 后台收到的文件名中文乱码, filename中文乱码

    在jQuery File Upload.js文件里,在以下这个js中有个成员叫做 _initXHRData, 是一个function, 在这个function的最后部分有一个if-else分支,如下: ...

  7. jquery file upload 与 uploadify

    对于图片上传来说有各种js库来帮助实现此功能,常用的包括uploadify和jquery的file upload这两个库. 1.uploadify实现起来比较简单 http://www.uploadi ...

  8. jquery file upload 限制上传文件的格式、大小或图片尺寸

    限制文件格式.大小 $("#head").fileupload({url: "/front/user/uploadHead",dataType: 'json', ...

  9. 简单的python案例_基于python的最简单jQuery File Upload示例

    https://github.c➜ flask-demo tree . ├── app.py ├── static │ ├── 123.txt │ └── file-upload │ ├── angu ...

  10. fileupload的回调方法_jQuery File Upload文件上传插件使用详解

    本篇教程介绍了jQuery File Upload文件上传插件使用详解,希望阅读本篇文章以后大家有所收获,帮助大家对jQuery的理解更加深入. < jQuery File Upload 是一个 ...

最新文章

  1. Mac下pycharm如何安装pytorch
  2. docker mysql配置 丢失_Docker 从入门到掉坑
  3. const和define 区别
  4. Git教程——入门基础
  5. 第15组构建之法团队心得
  6. js 一个关于图片onload加载的事
  7. hdu 1233还是畅通工程 最小生成树(入门题)prim算法
  8. w ndoWs8pE模式下载,win7 PE
  9. 二叉搜索树的两种实现(数组模拟,STL)
  10. 最新最简单的黑苹果Mac Windows双系统教程(单双系统通用)
  11. 谷歌浏览器http请求出现:Provisional headers are shown 提示
  12. 视频切割:python将视频文件按秒存储成图片
  13. 360 面试 一面+二面
  14. 【YOLOV5-5.x 源码解读】plots.py
  15. 【ElectronJs】基于Electron Forge打包的一些问题汇总
  16. ML之FE:特征工程处理中常用的数据变换(log取对数变换等)之详细攻略
  17. 关于传奇皓月GOM引擎登录器配置与生成完整教程
  18. 删除桌面“恶意”图标
  19. peel在Linux生成excel,如何将多个Excel文件合并成一个且保留原有数据?
  20. Instagram: 从图片发布到聊天工具的蜕变

热门文章

  1. ExtJS学习------Ext.define的继承extend,用javascript实现相似Ext的继承
  2. imos 学习笔记四 录像 c#
  3. Hadoop平台简述
  4. PacketFence ZEN 4.0.1 发布,网络接入控制
  5. 【综述论文】2020年最新深度学习自然语言处理进展综述论文!!!
  6. 【福利】本人自学深度学习的300G的学习资料愿与大家分享!一起进步!
  7. OpenCV4系统化学习路线图与教程
  8. python_thrift
  9. 这篇文章是我用AI生成出来的
  10. 7.1 API:GaussianMixture