2017-10-19 90 views
-1

我有一些JavaScript需要在提交表单之前运行。部分运行的JavaScript是异步运行的分块文件上传器:(resumable.js)。jQuery在回调中解除绑定

该库提供了一个函数来监听上传完成的时间。当我在这个函数内部解绑定提交事件时,表单不会提交,页面只是重新加载。但是,当解除绑定不在函数内部时(尽管在文件上传器完成其工作之前),表单会提交。

此代码不提交表单(r是分块的文件上传的对象实例):

$('#Form1').submit(function (e) { 
    var form = $(this); 

    e.preventDefault(); 

    r.upload(); //async 

    r.on('complete', function() { 
     form.unbind('submit').submit(); 
    }); 
}); 

这段代码提交表单(但显然太早,之前上传能做的工作):

$('#Form1').submit(function (e) { 
    var form = $(this); 

    e.preventDefault(); 

    r.upload(); //async 

    form.unbind('submit').submit(); 
}); 

为了澄清,我希望发生的一连串事件是这样的:

  1. 用户点击提交。
  2. JavaScript上传器将文件上传到Web服务。
  3. 上传完成后,即可发布网页表单。

编辑:问题的症结是:

r.on('complete', function() { 
    form.unbind('submit').submit(); 
}); 

上面的代码片段不会以同样的方式表现为这样:

form.unbind('submit').submit();

,我不能图为什么。

+0

你想要一个传统的表单文章,整页重新加载,对不对? – Tomalak

+0

它应该没问题 - 你在做什么看起来没问题。你确定'complete'处理程序正在被解雇吗?只要在里面放一个'console.log',你就可以看到它发生了。 – Archer

+0

下面是一个工作示例... https://jsfiddle.net/smqkeveo/ – Archer

回答

-1

我不明白你为什么需要解除绑定事件,但是如果你只需要触发一次,就可以使用.one来附加事件。它在火灾后自动解除绑定。

我想我误解了你的问题。下面的代码适用于我。我认为很清楚:定义函数来终止提交并开始上传;在可恢复完整的解除绑定功能后触发表单提交。

function pseudoSubmit(e) { 
    e.preventDefault(); 
    return r.upload(); 
}; 
r.on('complete', function() { 
    $('#Form1').off('submit', pseudoSubmit).submit(); 
}); 

$('#Form1').on('submit', pseudoSubmit);