而不是修改「其他」的結果,以實現您正在尋找的,我建議使用select2:select
事件和maximumSelectionLength
選項的組合。
因此,您將從包含默認顏色列表的標記開始,然後使用一個「其他」選項。
<select multiple="multiple">
<option value="red">Red</option>
<option value="blue">Blue</option>
<option value="green">Green</option>
<option value="yellow">Yellow</option>
<option value="custom">Other</option>
</select>
請注意,我已經設置了value
爲「其他」選項custom
,你可以選擇任何你想,只要它不會與顏色衝突。這只是將用於確定何時顯示顏色選擇器的「標誌」選項。
爲了最終將選擇的數量限制爲只有五種顏色,可以使用maximumSelectionLength
選項初始化Select2並將其設置爲5
。這將告訴Select2只允許五個選擇,並且您可以找到一個示例in the documentation。
var $element = $("select").select2({
maximumSelectionSize: 5
});
所以,現在您的選擇數量有限,我們可以通過「其他」選項來實現顏色選擇器。我們可以通過監聽select2:select
選項來檢測何時選擇了「其他」選項,該選項在選擇選項時被觸發。
$element.on("select2:select", function (evt) {
// handle the "Other" option
});
從那裏,你需要明確地發現了「其他」選項,這樣我們就可以檢查通過select2:select
事件的custom
的id
,這就是我們之前設置傳入的數據對象。由於您希望保持打開多個自定義顏色的選項,我們將在選中時立即取消選擇「其他」選項。
function (evt) {
// check for the custom id
if (evt.params.data.id === 'custom') {
// unselect the element, so other custom colors can be picked
evt.params.data.element.selected = false;
// update the selection
$(this).trigger('change');
}
}
從那裏,你需要實現用戶可以選擇顏色的部分。出於這個目的,我只用了一個prompt
要求顏色。因爲prompt
是同步的,所以我們可以等待給出的選擇。但是您的顏色選擇器很可能是異步的,所以您可能必須將其餘的事件放在不同的事件處理程序中。
// prompt the user for a color somehow
var color = prompt("Pick a color, any color");
一旦顏色已經選定,你將需要創建一個自定義<option selected>
它。這樣值就會被髮送到服務器,所以Select2可以知道選擇了什麼顏色。
// create a new option
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptionElement/Option
var option = new Option(color, color, null, true);
和所有你需要做的就是把它添加到原<select>
並在其上觸發change
事件,因此選擇二(和其他組件)會知道該值改變。
// add the option to the original select, before the "Other" option
$(option).insertBefore(evt.params.data.element);
// update the selection
$element.trigger('change');
現在,Select2將顯示新的自定義顏色以及任何其他選擇。用戶還可以通過多次選擇「其他」選項來選擇其他顏色。
所以,把他們放在一起給你下面的代碼
var $element = $("select").select2({
maximumSelectionLength: 5
});
$element.on('select2:select', function (evt) {
// check for the custom id
if (evt.params.data.id === 'custom') {
// unselect the element, so other custom colors can be picked
evt.params.data.element.selected = false;
// update the selection
$(this).trigger('change');
// prompt the user for a color somehow
var color = prompt("Pick a color, any color");
// create a new option
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptionElement/Option
var option = new Option(color, color, null, true);
// add the option to the original select, before the "Other" option
$(option).insertBefore(evt.params.data.element);
// update the selection
$element.trigger('change');
}
});
你可以在以下jsbin現場測試:http://jsbin.com/beluximesi/1/edit?html,js,output
寫得很好,但我不希望新創建的選項可被搜索和可見,特別是在它們被移除後。 – 2015-03-19 15:36:59