Perlを中心とした技術系の話などをつらつら

2006年05月21日

OOなJavaScriptの勉強がてら、ボタンの2度押し禁止機能を簡単に実現するライブラリを作ってみました

ちょっと時代に乗り遅れている気もしますが、最近prototype.jsをつかったOOなJavaScriptを書くのにはまっています。

今日はbindとbindAsEbentListenerの勉強がてら、これまたかなり昔話題になった「2度押し禁止ボタン」を実現するコードを書いてみました。

input.js

使い方はこんな感じです。

 // prototype.jsとinput.jsをロードします。
 <script type="text/javascript" src="/path/to/prototype.js"></script>
 <script type="text/javascript" src="/path/to/input.js"></script>
 <script type="text/javascript"><!--
 // windoのロード時に2度押し禁止機能を有効にします。
 Event.observe(window, 'load', function(){
     // ボタンのIDか要素のオブジェクトを渡せばクリックすると押せなくなります。
     new Input.DisableAfterClick('myButton');
 }, false);
  --></script>

ボタンのテキストを変えたい場合は2番目の引数に代替テキストを渡します。

画像の場合は代替画像のURLを渡します。

    new Input.DisableAfterClick('mySubmitButton2', '送信中です');
    new Input.DisableAfterClick('myImageButton2', '/path/to/image2.gif');

一定時間経過後にボタンを再度有効にしたい場合は、3番目の引数に有効にするまでの時間をミリ秒単位で渡します。

    new Input.DisableAfterClick('myButton', '1秒後にまた有効になります', 1000);

サンプルページにサンプルがあります。

また、input.jsの中身はこんな感じです。画像ボタンの扱いはもっといい方法があるのかなーとも思うんですが、おかしなところがあったら突っ込んでください。

var Input = new Object();
Input.DisableAfterClick = Class.create();
Input.DisableAfterClick.prototype = {
    initialize : function(input, alt, timer){
        this.input = $(input);
        this.alt   = alt;
        this.timer = timer;
        this.org   = this.input.type == 'image'
                   ? this.input.src
                   : this.input.value;
        this.stopEvent = this._stopEvent.bindAsEventListener(this);
        Event.observe(this.input, 'click', this.disable.bind(this));
    },
    disable : function() {
        this.input.blur();
        if (this.input.type == 'image'){
            if ( this.alt )
                this.input.src = this.alt;
            Event.observe(this.input, 'click', this.stopEvent);
        } else {
            if ( this.alt )
                this.input.value = this.alt;
            this.input.disabled = true;
        }
        if (this.timer)
            setTimeout(this.enable.bind(this), this.timer);
    },
    enable : function() {
        if (this.input.type == 'image'){
            if ( this.alt )
                this.input.src = this.org;
            Event.stopObserving(this.input, 'click', this.stopEvent);
        } else {
            if ( this.alt )
                this.input.value = this.org;
            this.input.disabled = '';
        }
    },
    _stopEvent : function (evt) {
        evt.stop();
        return false;
    }
};

Technorati TAGTechnorati TAG , ,

Posted by horiuchi at 2006年05月21日 02:37

Continuing the discussion...

このエントリーのトラックバックURL:
http://hori-uchi.com/mt/trackback/437

このリストは、次のエントリーを参照しています: OOなJavaScriptの勉強がてら、ボタンの2度押し禁止機能を簡単に実現するライブラリを作ってみました:

え、こんなバイトがあったの? 今だけ限定丸秘裏バイト公開中。あなたは、裏バイトを発見できるか?(サイトのどこにあるのか探してみてね☆)

続きを読む: 裏バイト/裏求人/裏仕事/闇バイト情報

from 裏バイト/裏求人/裏仕事/闇求人 at 2006年07月17日 01:57

Comments

特にサンプル2とサンプル3が、Firefoxで挙動おかしいっぽいです。

Posted by kawachi at 2006年05月22日 01:54

type="button"以外のやつがおかしいみたいでした。

Posted by kawachi at 2006年05月22日 02:05

这个文章不错的说。

Posted by jerry chen at 2006年06月28日 15:43

Post a comment




Remember personal info?