2013-02-01 52 views
0

我有一個表單,我不想在第一次提交被點擊時提交,但第二次它應該像正常提交一樣工作。所以我加載了一個not-submittable類到載入的表單,然後在第一次點擊刪除那個類...應該(我認爲)使它正常提交。但是,這並沒有發生。第一次點擊按預期工作,刪除類並更改按鈕文本。然而,第二次點擊完全一樣。那麼,我在這裏錯過了什麼?防止表單提交工作...太好了

的jQuery:

$('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE').addClass('not-submittable'); 

    $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE.not-submittable').click(function(event) { 
     $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE').removeClass('not-submittable'); 
     $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE').val('Continue'); 
     $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE').removeAttr('disabled'); 
    return false; 
    }); 

預JavaScript的按鈕:

<input type="submit" class="Button" value="Submit Survey" id="ACTION_SUBMIT_SURVEY_RESPONSE" name="ACTION_SUBMIT_SURVEY_RESPONSE"> 
+0

你需要測試類的存在,並採取相應的行動。 –

+2

研究jQuery ['.one()'](http://api.jquery。com/one /)。你可以使用它來做** **一次**。 – Sparky

+2

NITPICK不要一直重複做$(...)。使用鏈接或將其存儲到變量中。一遍又一遍地查看是SLOW。 – epascarello

回答

1

你可以做這樣的事情

$(document).ready(function() { 

     $('#ACTION_SUBMIT_SURVEY_RESPONSE').click(function (event) { 
      if (!$('#ACTION_SUBMIT_SURVEY_RESPONSE').hasClass(".not-submittable")) { 

       //do all conditions you wish on first click 

       //if condidition meets add this class to button 
       $('#ACTION_SUBMIT_SURVEY_RESPONSE').addClass(".not-submittable"); 

       //stop form submit 
       event.preventDefault(); 
      } 
      else { 

       //calls when button have .not-submittable class may be second or any no of clicks 
       $('#ACTION_SUBMIT_SURVEY_RESPONSE').removeClass('not-submittable'); 
       $('#ACTION_SUBMIT_SURVEY_RESPONSE').val('Continue'); 
       $('#ACTION_SUBMIT_SURVEY_RESPONSE').removeAttr('disabled'); 
       //commented return false so form submits normally 
      } 
     }); 

    });  
+0

我結束了與此類似的事情。雖然我意識到我原來的問題的措辭並不理想,但這是唯一能夠按預期結束工作的事情。特別是我使用:'if(!$(this).hasClass('not-submittable')){return true; }' – Samsquanch

+0

很高興看到我的回答幫助您解決問題 –

3

而不是使用.click()的,請嘗試使用.on().off()方法來綁定和取消綁定事件。你的情況:

$('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE.not-submittable').on("click.stopSubmit", function(event) { 

    $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE').removeClass('not-submittable'); 
    $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE').val('Continue'); 
    $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE').removeAttr('disabled'); 

    if (...conditions are met.....) { 
     $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE.not-submittable').off("click.stopSubmit"); 
    } 

    return false; 
}); 

您可能會注意到.on()方法的第一個參數是處理的字符串表示,但我附加命名空間「.stopSubmit」。 Namespacing你的處理程序允許你解除一個特定的點擊處理程序,而不是所有的點擊處理程序。最好的部分是,如果原始處理程序中有代碼仍然需要使用,則可以使用單獨的單擊處理程序來運行該代碼,並且在解除綁定「.stopSubmit」處理程序時它不會解除綁定。

請注意,.on().off()是推薦的綁定/解除綁定方法 - jQuery的不再建議.bind().unbind()


UPDATE
閱讀不解除綁定後,直到某些條件滿足您的意見後,我會想指出的是,你可以插入一個條件的.off()電話。我更新了代碼以反映這一點。

+1

如果他可以使用'.on()'和'.off( )',那麼爲什麼他不能使用'.one()'而不是? – Sparky

+0

如果方法中存在其他代碼,並且希望在阻止提交的代碼停止後仍然運行,那麼我會提供'.on()'和'.off()'suggestign'。本質上,'.on()'和'.off()'將使它更具可擴展性。不過,'.one()'方法是一個有效的解決方案。 –

1

如果有必須匹配使用這個地方submitable包含您的邏輯是什麼使得它可以發送表單一定的標準:

var submit = $('form#survey_7042 #ACTION_SUBMIT_SURVEY_RESPONSE'); 
submit.addClass('not-submittable'); 

submit.click(function(event) { 
    if (true == submitable) { 
     submit.removeClass('not-submittable').val('Continue').removeAttr('disabled'); 
     submit.unbind(); 
     event.preventDefault(); 
    } 
}); 
4

報價OP:「我有沒有一種形式想要提交第一個 時間提交點擊,但第二次它應該像 正常提交工作。「

使用jQuery .one()僅在第一次點擊時屏蔽submit

http://api.jquery.com/one/

$('#ACTION_SUBMIT_SURVEY_RESPONSE').one('submit', function(e) { 
    e.preventDefault(); 
    // do what you need to do on first click 
} 

或者......

$('#ACTION_SUBMIT_SURVEY_RESPONSE').one('submit', function(e) { 
    e.preventDefault(); 
    // do what you need to do on first click 
    if (some-condition) { // under certain conditions allow submit on first click 
     $(this).submit(); 
    } 
} 
+0

+1最短的代碼。也許你可以補充一點,他可以在函數內部使用'$(this).removeAttr()'(作爲例子)。 – insertusernamehere

+0

@insertusername這裏,謝謝你。我會留給讀者在我的評論欄中插入任何他們想要的東西。顯然OP無論如何都不能使用這個解決方案。 – Sparky

+0

的確如此。我只是提到它要向OP表明,他不必一直重新查詢以及如何訪問元素本身。 – insertusernamehere