2014-11-08 115 views
2

我在元素中有option個狀態的列表。HTML選擇 - 在HTML中顯示值屬性,但保留選項文本

<select> 
    <option value="AL">Alabama</option> 
    <option value="AK">Alaska</option> 
    <option value="AZ">Arizona</option> 
    <option value="AR">Arkansas</option> 
</select> 

我需要的瀏覽器顯示的狀態(這是當前存儲在value屬性),但打開的下拉菜單中應仍顯示狀態的全名,只是縮寫。因此,用戶將在下拉菜單中看到並選擇「亞利桑那」,然後關閉的下拉菜單將顯示「AZ」。

this question的第一個答案已接近,但它將option文本替換爲value的值,因此它對我無效。

我想爲此使用JavaScript/JQuery,但對任何只能使用HTML和CSS執行此操作的嚮導都很感謝。

有關如何實現此目的的任何想法?

+0

相當肯定,不能單獨用HTML和CSS來完成。 – CBroe 2014-11-08 22:13:53

+1

這樣做的意義何在?這需要一個解決方案,因爲'select'元素沒有像'open'和'close'這樣的事件。也可能會混淆用戶。如果你真的想這樣做,那麼我建議使用自定義選擇菜單。 – undefined 2014-11-08 22:37:29

+0

@Vohuman,實際上,使用jQuery的'focus'和'blur'將反映開啓和關閉狀態。 – 2014-11-08 23:44:31

回答

3

如果你還在尋找答案,這裏是我該怎麼做。

首先,我沒有看到太多的用例這樣做。無論如何,用戶可以輕鬆讀取的單詞縮寫似乎很費力。雖然,在這裏。

因爲有檢查最後選擇的,除非我們將其存儲在一個變量,然後遍歷列表,當用戶選擇輸入帶回名字沒有真正的方法,它需要很多努力。雖然,我們可以將數據存儲在數組中的選擇內,然後將數據存儲在任何我們想要的地方。在這種情況下,我不建議直接從HTML元素中使用數據,但現在,您可以在下面的示例中看到,將數組中的狀態存儲在數組中會發揮作用。

以下的答案必須jQuery

JSFiddle,或運行代碼:

;(function() { 
 

 
    var states = []; 
 
    var customSelect = $('.js-select'); 
 
    var customSelectOptions = customSelect.children(); 
 

 
    // Get each state then push them to the array 
 
    // Initial state declaration 
 
    customSelectOptions.each(function() { 
 
     var state = $(this).text(); 
 
     states.push({ state: state }); 
 
     if ($(this).is(':selected')) { 
 
      $(this).text($(this).attr('value')); 
 
     } 
 
    }); 
 

 
    // On focus, always retain the full state name 
 
    customSelect.on('focus', function() { 
 

 
     customSelectOptions.each(function(index) { 
 
      $(this).text(states[index].state); 
 
     }); 
 

 
     // On change, append the value to the selected option 
 
     $(this).on('change', function() { 
 

 
      customSelectOptions.each(function(options) { 
 
       if ($(this).is(':selected')) { 
 
        $(this).text($(this).attr('value')); 
 
       } 
 
      }); 
 

 
      // Un-focus select on finish 
 
      $(this).blur(); 
 

 
     }); 
 

 
    }); 
 

 
}(jQuery));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select class="js-select"> 
 
    <option value="AL">Alabama</option> 
 
    <option value="AK">Alaska</option> 
 
    <option value="AZ">Arizona</option> 
 
    <option value="AR">Arkansas</option> 
 
</select>

+0

非常感謝你;這個伎倆。我需要做的唯一的變化是增加了'customSelect.children()''另一個。兒童()',因爲在全名單上有'optgroup's所以我需要深入更深一層。 – Vincent 2014-11-09 01:28:34

+1

一個問題我初涉時注意到:當您選擇列表中,但不做出改變(例如,你選擇相同的項目或單擊其他地方關閉下拉菜單),它會顯示它的全名國家。我試着將'blur'和'focusout'事件添加到'.on',但都導致了奇怪的行爲。 'click'和'mouseup'也​​不起作用。任何想法如何修改以避免這種情況? – Vincent 2014-11-09 01:53:13

+1

同樣的事情也會發生,當你選中它時,但不要做任何改變時通過窗體。 – Vincent 2014-11-09 02:17:52

0

JavaScript將被要求這樣做。我使用Chrome將this demo放在一起,因此select的寬度可能需要進行調整,以使其在所有瀏覽器中都很好看。

CSS

select { 
    width: 12px; 
    border: 0; 
    /* text-indent: -999em; */ /* or hide text so the width can be set higher */ 
} 

HTML

<span class="select-value"></span> 
<select> 
    <option value="AL">Alabama</option> 
    <option value="AK">Alaska</option> 
    <option value="AZ">Arizona</option> 
    <option value="AR">Arkansas</option> 
</select> 

腳本

$(function(){ 
    $('select').on('change', function(){ 
     $('.select-value').html(this.value); 
    }).change(); 
}); 

更新:爲了減輕使文字可點擊的關注,更多的代碼可以被添加,然後重新定位選擇(demo

CSS

select { 
    width: 50px; 
    border: 0; 
    text-indent: -999em; 
} 
.select-value { 
    position: relative; 
    left: 30px; 
    z-index: 1; 
} 

腳本

$(function() { 
    $('select').on('change', function() { 
     $('.select-value').html(this.value); 
    }).change(); 

    $('.select-value').on('click', function() { 
     $('select').focus(); 
    }); 
}); 
+0

這感覺非常難以用原始HTML取代選擇視圖。真實世界用例中的可訪問性災難。 – 2014-11-08 22:32:18

+0

它不會取代選擇,它只是使它非常窄,所以下拉箭頭仍然是可點擊的,您仍然可以選中它。 – Mottie 2014-11-08 22:54:29

+0

嗯。在移動設備上,這不是一個真正的故事,因爲除非你的拇指直接放在箭頭上,否則你無法真正選擇它。 – 2014-11-08 23:02:50

1

肯定不能在HTML和CSS來實現.. JS在這裏是必需。

那麼你可以使用「change()」jQuery函數來處理更改選項的操作。然後你可以通過'selected'屬性獲取selected選項值,並將其作爲選擇的選項文本,然後在select元素上使用「click()」並將選項文本返回原始值。

這是棘手的遊戲,不乾淨。

其他選項將創建一些容器來存儲所選選項的值。在這種情況下,您將需要將此容器設置爲選擇按鈕,並在單擊時選擇元素將被單擊(此處爲更多javascript)。

在你的情況下,我會搜索一個漂亮而強大的選擇元素插件,這將盛大你的需求。

2

嗯,我沒有考慮使用blurfocus事件。如果使用jQuery是一個選項:

$('select').on('blur focus', function (e) { 
    $(this.options).text(function() { 
     return e.type === 'focus' 
       ? this.getAttribute('data-default-text') 
       : this.value; 
    }); 
}).children().attr('data-default-text', function() { 
    return this.textContent; 
}); //.end().on('change', function() { $(this).blur(); }).blur(); 

http://jsfiddle.net/0vre3cmg/

+0

這是一個不錯的解決方案! – Mottie 2014-11-09 00:07:08

+0

@Mottie謝謝:),傾聽「焦點」和「模糊」事件的想法屬於詹姆斯。 – undefined 2014-11-09 00:26:23

+0

@Vohuman,不用擔心哥們,你最終確定了這麼多該死的清潔工!太! – 2014-11-09 11:20:31