LoginSignup
2
5

More than 5 years have passed since last update.

htmlのセレクトのオプションで改行(jQuery-ui widget)

Last updated at Posted at 2018-02-02

セレクトのオプションで改行

htmlのセレクトボックスの選択肢で改行するのは、デフォルトではサポートされていないのでjavascriptを使う必要があるみたいです。調べたところ、2つのjQuery-uiの拡張が見つかりました。

シンプルな後者を使ってみます。これはjQuery-uiのwidgetの拡張を利用したものです。

See the Pen example by NomuraS (@NomuraS) on CodePen.

optionをjavascriptで後から追加した場合、下のようにdestroyを使ってリセットする必要があります(stackoverflow)。

$('#button').click(function(){
    $('#select').append($('<option>').html('line1 |  line2'))
    $("#select").multilineSelectmenu('destroy');
    $("#select").multilineSelectmenu();
})

changeイベント

changeイベントの追加は、(multilineSelectmenuのベースである)jQuery-uiのselectmenuの場合は

$('#select').on('selectmenuchange',function(){
     ...
})

で使えます(公式ドキュメント)。追加optionに対してでなければ、

$('#select').multilineSelectmenu({
    change: function(event,data){ 
        ...
    }
})

で使えます。ただ、独自のwiedgetで追加optionに対してchangeイベントを与える正当な方法がよく分かりませんでした。下記は、とりあえずの対処法で、ライブラリの3行目に処理を書きます。これでchangeイベントの同じ扱いができます。

var multilineSelectmenu = $.widget("ui.multilineSelectmenu", $.ui.selectmenu, {
    _setText: function (element, value) {
        console.log($('#select').val()) // オプションを変更するたびに、$('#select').val()の値が変化する
        if (value) {
            if (value.indexOf('|') !== -1) {
                var lines = value.split('|');
                value = '<span class="ui-selectmenu-menu-item-header">' + lines[0].trim() + '</span>';
                for (var i = 1; i < lines.length; i++) {
                    value = value + '<span class="ui-selectmenu-menu-item-content">' + lines[i].trim() + '</span>';
                }
            }
            element.html(value);
        } else {
            element.html("&#160;");
        }
    }
});

付け加えておくと、上の'|'(パイプ)を変更すれば改行する記号を変更できます。例えば、%などでも改行できます。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5