2017-10-19 38 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);