二重投稿防止の履歴

jQueryプラグイン


http://item.mindia.jp/akkun_dev/jquery.submitDisable.js

/**
 * jquery.submitDisable.js
 * 
 * usage:
 $('#yourForm').submitDisable();
 $('#yourForm').submitDisable({
      'recoveryTime': 100000,
      'onBeforeSubmit': function(){
          alert('before');
      },
      'onAfterSubmit': function(){
          $('#myForm1').hide();
          alert('after');
      }
  });
 * 
 */
// IE6-8, Firefox3.5, Opera10, Safari4
(function(){
  var defaultOptions = {
    // 送信してからdisable解除するまでのマイクロ秒。0なら解除しない
    'recoveryTime': 0,
    // submit直前に実行するcallback
    'onBeforeSubmit': null,
    // submit直後に別スレッド?で動作するcallback。Operaでは使えないみたい
    'onAfterSubmit': null
  }
  var cancelEnter = function(e){
    if (e.keyCode == 13){
      return false;
    }
  };
  var $ = jQuery;

  jQuery.fn.submitDisable = function(options){
    options = jQuery.extend(defaultOptions, options);
    
    var submit = $('input[type=submit]', this);
    // IEはtext内でEnterすると送信できる
    var text = $('input[type=text]', this);
    // 解除する
    var recover = function(){
      submit.attr('disabled', '');
      text.unbind('keypress', cancelEnter);
    }
    
    // 初期化。戻った場合に実行するように。
    recover();

    $(this).submit(function(){
      if ($.isFunction(options['onBeforeSubmit'])){
        options['onBeforeSubmit']();
      }
      submit.attr('disabled', 'disabled');
      text.bind('keypress', cancelEnter);
      if (options['recoveryTime'] > 0){
        setTimeout(recover, options['recoveryTime']);
      }
      if ($.isFunction(options['onAfterSubmit'])){
        setTimeout(options['onAfterSubmit'], 1);
      }
    });

    return this;
  }
})();