こんにちは、こんばんは、新人のMです。 アドベントカレンダーを始めたはいいものの12/1が終わるまで時間がないので、簡単なネタで行きたいと思います。
セレクトボックスの内容を動的に書き換えたいことが、よくあるのですが、そんなときに使えるjQueryプラグインを書いてみました。 数十行なので読んでいただいたら、わかると思いますが、すこし説明します。
使い方
こんな感じに、hashの配列を渡してあげると、指定したセレクトボックスのoptionを書き換えてくれます。
var a = [ { text: "a", value: "1"}, { text: "b", value: "2", "data-b-c": "b"}, { text: "c", value: "3", selected: true} ]; $("select").simpleOptions(a);
書き換えてくれる属性は、今のところ以下のものになります。
- text
- value
- selected
- disabled
- data-*
他の属性も書き換えたいときは、適宜コードに追加してくだい。
セレクトボックスのvalueが変わったら、changeイベントを発火するようにしてあります。
コード
2番目のスクリプトタグ内のコードをコピペしてお試しください。
<html> <head> <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script> <script type="text/javascript"> (function($) { var simpleOptions = function(arr) { var $options = this.find("option"); var selected = this.val(); var diff = arr.length - $options.length; if (diff < 0) $options.slice(diff).remove(); else if (diff > 0) { var fragment = document.createDocumentFragment(); for (var i = diff; i; --i) fragment.appendChild(document.createElement("option")); this.append(fragment); } var some = arr.some(function(v) { return !!v.selected;}); this.find("option").each(function(i, v) { v.value = arr[i].value; v.text = arr[i].text; v.selected = some ? !!arr[i].selected : ""+arr[i].value === selected; v.disabled = !!arr[i].disabled; for (var k in v.dataset) delete v.dataset[k]; for (var k in arr[i]) if (/^data-.+/.test(k)) v.setAttribute(k, arr[i][k]); }); if (this.val() !== selected) this.change(); return this; }; $.fn.simpleOptions = simpleOptions; })(jQuery); </script> <script type="text/javascript"> $(function() { $("select").on("change", function() {console.log(this);}); var a = [ { text: "a", value: "1"}, { text: "b", value: "2", "data-b-c": "b"}, { text: "c", value: "3", selected: true} ]; $("select").simpleOptions(a); }); </script> </head> <body> <select style="width: 100px"> <option data-test="test"></option> <option data-test="test"></option> <option data-test="test"></option> <option data-test="test"></option> </select> </body> </html>
注意
DOMを使いまわしてるので、option自体に何かイベントを割り当てたときは、正しく動作しないので、ご注意ください。
まとめ
セレクトボックスのoptionを書き換えてくれるjQueryプラグインを作りました。 やっつけ感はありますが、大抵の場合はこれで事足りると思います。(アドバイスがあればお願いします)