【问题标题】:Why doesn't Blueimp's jQuery-File-Upload plugin fire callbacks?为什么 Blueimp 的 jQuery-File-Upload 插件不触发回调?
【发布时间】:2011-09-10 22:37:24
【问题描述】:

我正在尝试使用Blueimp's jQuery-File-Upload 插件,从demo 来看,它看起来很有希望。

实现起来真的很简单:

var $uploadButton = $("#fileop-upload");// <input type="file" id="fileop-upload" [etc] />
$uploadButton.fileupload({
    url : "//domain/path/to/receive-uploaded-files"
});

所选文件上传正常,无需按预期刷新页面,但当然,像这样的最小配置用户不会收到任何通知。这就是插件的回调会派上用场的地方。

根据文档,定义回调有两种方法。 For example the add event (which fires whenever a file is selected for uploading) can be added in the original configuration object like this:

$uploadButton.fileupload({
    add : addFileListener,
    url : "//domain/path/to/receive-uploaded-files"
});

或者:

$uploadButton.bind("fileuploadadd", addFileListener);

但是我发现只有第一种方法有效,第二种方法不起作用。

更奇怪的是,无论我如何绑定它们,似乎都没有其他回调——尤其是 progressstart——被触发:

$uploadButton.fileupload({
    add : addFileListener,
    progress : progressListener,
    start : startListener,
    url : "//domain/path/to/receive-uploaded-files"
});

$uploadButton.fileupload({
    add : addFileListener,
    url : "//domain/path/to/receive-uploaded-files"
});
$uploadButton.bind("fileuploadprogress", progressListener");
$uploadButton.bind("fileuploadstart", startListener");

我定义了引用的侦听器函数,并且代码不报告任何错误或警告。

.bind 方法失败的原因是什么,为什么 progressstart 侦听器从未激活?

【问题讨论】:

  • 出于好奇,您能确认一下您使用的是什么 jQuery 和上传器版本吗?我正在使用 jQ 1.5.2 和 4.4.2 版本的上传插件。
  • 我使用了最新的、新下载的 jQuery 版本和上传插件。无论如何,我现在已经放弃了这个插件,并开发了一个纯粹的基于文件 API 的解决方案 (blog.new-bamboo.co.uk/2010/7/30/html5-powered-ajax-file-uploads),它只适用于 FF4+、Chrome 和 Safari,但幸运的是,这对于我现在的目的来说是可以接受的。

标签: jquery file-upload callback jquery-file-upload blueimp


【解决方案1】:

不确定这是否解决了您的问题,但对我来说,以下内容不起作用(应该按照文档工作:

$uploadButton.bind 'fileuploadchange', (e, data) =>
  # Do something

但是,以下工作:

$uploadButton.bind 'change', (e, data) =>
  # Do something

【讨论】:

    【解决方案2】:

    如果定义了添加事件,所有的进程回调都不会触发。

    $(function(){
        var fileupload=$('#fileupload').fileupload({
            url: 'fileupload.php',
            dataType: 'json',
            add: function(e, data) {
                data.submit();
            },
        })
        .on('fileuploadprocessalways', function (e, data) {
            //Won't be triggered if add callback is defined
        })
    });
    

    【讨论】:

      【解决方案3】:

      这对我不起作用。

      $('#fileupload').fileupload({url: '/url/to/server/'});
      
      $('#fileupload').bind('fileuploaddone', function (e, data) {
         console.log('success!!!');
      
         console.log(e);
      
         console.log(data);
      
      });
      

      但这确实发生了!

      $('#fileupload').fileupload({url: '/url/to/server/'}).bind('fileuploaddone', function (e, data) {
         console.log('success!!!');
      
         console.log(e);
      
         console.log(data);
      
      });
      

      我的第一个猜测是,在第一种情况下,您将事件绑定到实际的表单输入而不是 fileupload 对象,而在第二种情况下,通过使用链接,您实际上是在使用 fileupload 对象,我猜文档是模棱两可的因为上面写着:

      $('#fileupload').bind('fileuploadadd', function (e, data) {/* ... */});
      

      它应该是

      $('#fileupload').fileupload().bind('fileuploadadd', function (e, data) {/* ... */});
      

      【讨论】:

        【解决方案4】:

        而不是,

        $('#fileupload').bind('fileuploadadd', function (e, data) {/*...*/});
        

        我用过,

        $('#fileupload').bind('fileuploadchange', function (e, data) {/*...*/});
        

        它对我有用。

        【讨论】:

          【解决方案5】:

          我是 jQuery File Upload 插件的作者。

          我没有解释为什么您的第三个示例代码中的 fileuploadadd 事件没有触发。 但是,如果您覆盖 add 回调选项,则必须确保通过调用 data 参数的 submit 方法来启动文件上传,如 Options documentation 中有关 add 回调的说明(并且在源代码中也有说明)插件)。

          例如下面的代码应该打印出不同的回调事件:

          $('#fileupload').fileupload({
              add: function (e, data) {
                  console.log('add');
                  data.submit();
              },
              progress: function (e, data) {
                  console.log('progress');
              },
              start: function (e) {
                  console.log('start');
              }
          }).bind('fileuploadadd', function (e, data) {
              console.log('fileuploadadd');
          }).bind('fileuploadprogress', function (e, data) {
              console.log('fileuploadprogress');
          }).bind('fileuploadstart', function (e) {
              console.log('fileuploadstart');
          });
          

          还请注意,该插件是模块化的,并且 UI 版本(在下载示例中使用)使用了回调选项,这些选项将被上述代码覆盖。 这就是事件绑定如此有用的原因,因为它允许在不覆盖通过选项对象设置的回调的情况下定义额外的回调方法。

          【讨论】:

          • 我加了:.bind('fileuploadsubmit', function (e, data) { console.log("fileuploadsubmit"); 但是,它不会触发...
          • 如果像我一样确保您的&lt;form&gt; 标签包含您的控件,用于添加文件的input 必须包含在表单中。想想就觉得有道理。
          • 很高兴我找到了这个!文档说添加了文件上传 (github.com/blueimp/jQuery-File-Upload/wiki/Options)
          • 对于 googlers 的另一件事,必须在呈现目标元素后附加处理程序。使用.bind().live() 将不起作用。
          • @Sebastian Tscahan,请帮我解决这个问题(我第二次向你寻求帮助)stackoverflow.com/questions/50974530/…
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-18
          • 2015-09-13
          • 2013-11-12
          相关资源
          最近更新 更多