IT業界のすみっこ暮らし

ふと気がついたときの記録

jQueryのclickイベントに関してメモ

下記のコードでunbind('click')がない場合、既に$('input[id^=attachmentData]')にclickイベントが宣言されている場合、同じイベントが重複して宣言されてしまう。

$('#elementId').unbind('click').click(function () {
    // 何らかの処理
});

なんでunbind('click')がないとダメか

ダメな例

下記のような初期設定を行うinit関数の中にclickイベントを設定した場合
※SPA開発で一つの画面で詳細画面を切り替えたり、、、

function init(){
    $('#elementId').click(function () {
        // 何らかの処理
        console.log('何らかの処理');
    });
}
1回目の初期設定後(ex) SPAな画面ではじめて詳細画面を開いた)
何らかの処理(clickイベントが1回実行される)
2回目の初期設定後(ex) SPAな画面で2回に詳細画面を開いた)
何らかの処理(1回目に宣言されたclickイベントが実行される)
何らかの処理(2回目に宣言されたclickイベントが実行される)
3回目の初期設定後(ex) SPAな画面で3回に詳細画面を開いた)
何らかの処理(1回目に宣言されたclickイベントが実行される)
何らかの処理(2回目に宣言されたclickイベントが実行される)
何らかの処理(3回目に宣言されたclickイベントが実行される)

これが新しく画面をレンダリングし直すまで永遠に続きます。
当然、正常な処理が出来るはずがないのでこういう作りは駄目です。

もちろん、SPAじゃない作りであれば問題ありません。

正しい例

前提はダメな例と同じです。

function init(){
    $('#elementId').unbind('click').click(function () {
        // 何らかの処理
        console.log('何らかの処理');
    });
}
1回目の初期設定後(ex) SPAな画面ではじめて詳細画面を開いた)
何らかの処理

clickイベントが1回実行される

2回目の初期設定後(ex) SPAな画面で2回に詳細画面を開いた)
何らかの処理

既存のclickイベントは全て無効にされ、2回目に宣言されたイベントのみが実行される

3回目の初期設定後(ex) SPAな画面で3回に詳細画面を開いた)
何らかの処理

既存のclickイベントは全て無効にされ、3回目に宣言されたイベントのみが実行される