jQueryUIで増減ボタン付きのテキストボックス

パッケージ開発担当のよみです。

最近旅行にいけてないです連休にでも行きたいです。
さて、お仕事でjQueryUIのspinnerを使う機会があったので復習をかねて書きたいと思います。
全然難しくないのですが、デザインを細かく変えたいとか、数値の変化を細かく制御したいとかはかなりメンドウです。
いい方法があるのかも知れませんが。。。

とりあえず作る

jQueryUI導入の話は省略します、
以下のようにspinnerを設定してあげれば後はjQueryUIが勝手にやってくれます。
stepで増減数値、max/minで上限下限、numberFormatでどういう数値なのかが設定できます。

<link rel="stylesheet" href="jquery-ui-1.10.4.custom.css">
<script src="jquery-1.10.2.js"></script>
<script src="jquery-ui-1.10.4.remote_custom.min.js"></script>

<script type="text/javascript">
$(function() {
    //0~10を0.1刻み
    $("#value").spinner({
        step: 0.1,
        max: 10,
        min: 0,
        numberFormat: "n",
        ※1
    });
});
</script>

<label for="price"></label>
<input id="value" name="value" value="1.5">

上下どちらを押したか知りたい時

「spin」は数値が変化する前に発生するのでそこで、
変化前と変化後の値を比べて上下を判断する事ができます。

※1
spin: function(event, ui){
    //現在の値-変更後の値
    if (($(this).val()-ui.value) < 0) {
        //上が押された
    }else{
        //下が押された
    }
    ※2
}

以降のイベントを発生させない

「step」に設定した値ではなく、自分で制御する場合数値が変更されないように
以降発生するイベントを動かないようにする。

※2
event.preventDefault();
event.stopImmediatePropagation();

増減ボタンのみ有効にする

お仕事で使用した時、ユーザーに手動入力して欲しくないとの要望だったので、
以下のようにすれば、スピナーのみ有効になるようです。

$("#value").attr("readonly",true);

最後に

この機能のことをスピナーという名前だとはじめて知りました、
名前を知らなかったので調べるのに苦労しました。。。

イベント部分ですが、連続クリックは問題ないですが
長押しした際「spin」のイベントが飛ばされるような挙動が多々確認できました。
自分で制御している場合、かなり問題になってきますね。。。