Для базового сравнения строк без учета регистра я предпочитаю не использовать внешнюю библиотеку, и при этом я не хочу отдельного класса строк с характеристиками без учета регистра, которые несовместимы со всеми моими другими строками.
Итак, я пришел к следующему:
bool icasecmp(const string& l, const string& r)
{
return l.size() == r.size()
&& equal(l.cbegin(), l.cend(), r.cbegin(),
[](string::value_type l1, string::value_type r1)
{ return toupper(l1) == toupper(r1); });
}
bool icasecmp(const wstring& l, const wstring& r)
{
return l.size() == r.size()
&& equal(l.cbegin(), l.cend(), r.cbegin(),
[](wstring::value_type l1, wstring::value_type r1)
{ return towupper(l1) == towupper(r1); });
}
Простая функция с одной перегрузкой для char и другой для whar_t. Не использует ничего нестандартного, поэтому должно работать на любой платформе.
Сравнение равенства не учитывает такие проблемы, как кодирование переменной длины и нормализация Unicode, но basic_string не поддерживает этого, о чем я все равно знаю, и обычно это не проблема.
В случаях, когда требуются более сложные лексикографические манипуляции с текстом, вам просто нужно использовать стороннюю библиотеку, такую как Boost, что и следовало ожидать.
css:
.set_width { width:120px; }
html:
<select class="set_width"><option>one</option><option>two</option></select>
Хорошо, вот решение, которое я нашел через некоторое время. Он автоматически увеличит размер поля выбора в зависимости от максимальной ширины дочерних параметров.
<script type="text/javascript">
window.onload = function()
{
var elem = document.getElementById('test');
var values = elem.length;
var biggest_value = 0;
var biggest_option = '';
for(var i = 0; i <= values; i++)
{
if (elem.options[i])
{
var len = elem.options[i].value.length;
}
if (biggest_value < len)
{
biggest_value = len;
biggest_option = elem.options[i];
}
}
document.getElementById('test').style.width = biggest_option.offsetWidth + 'px';
};
</script>
Поле выбора:
<select id="test">
<option value="Hello">Hello</option>
<option value="Hello Again">Hello Again</option>
<option value="Hello Yet Again">Hello Yet Again</option>
</select>
Абсолютно простой способ убедиться в том, что выбранные списки всегда имеют нужную ширину - это позволить браузеру задать их ширину, т.е. не задавать ширину самостоятельно. Этот "метод" (на самом деле не метод, так как он включает в себя , а не , делая что-то) будет работать в каждом браузере, даже в IE6.
.У меня есть решение, которое работает для меня, поэтому я подумал, что я буду идти вперед и опубликовать его (с некоторыми предостережениями внизу). Я уверен, что это не самое эффективное использование jQuery, но он работает, как я хочу, чтобы он работал. По сути, у меня есть список часовых поясов, которые (очевидно) довольно длинные текстовые струны.
<!--[if IE]>
<script type="text/javascript">
$(document).ready(function() {
$("select.timeZone")
.mouseover(function() {
$(this)
.data("origWidth", $(this).css("width"))
.css("width", "auto")
.focus();
})
.mouseout(function() {
$(this)
.blur(function() {
$(this).css("width", $(this).data("origWidth"));
})
.change(function() {
$(this).css("width", $(this).data("origWidth"));
})
});
});
</script>
<![endif]-->
Описание:
Предостережения:
Вот еще один подход, который сработал для меня:
<style>
select.limited-width {
width: 200px;
position: static;
}
select.expanded-width {
width: auto;
position: absolute;
}
</style>
<select class="limited-width"
onMouseDown="if(document.all) this.className='expanded-width';"
onBlur="if(document.all) this.className='limited-width';"
onChange="if(document.all) this.className='limited-width';">
<option>A normal option</option>
<option>A really long option which messes everything up</option>
</select>
Переключившись на position: absolute, вы удаляете элемент из потока страницы, что помогает, если вы найдете свой поле выбора перемещается, когда вы его расширяете.
Я решил полагаться на обнюхивание document.all как на проверку IE, поскольку он сохраняет его компактность и позволяет избежать необходимости в отдельной функции. Если это не сработает для вас, определите функцию в условных комментариях IE и вызовите ее вместо этого.
Одна небольшая ошибка: если вы выберете тот же элемент, он больше не сжимается, пока вы не переместите фокус на другой элемент, я называю это функцией; -)
Мне нравится решение 26design, но у него есть 2 недостатка:
При некоторых обстоятельствах можно дважды запустить событие наведения курсора мыши, в результате чего для переменной origWidth устанавливается значение «auto», предотвращающее выбор когда-либо возврат к исходному размеру.
Если текстовые значения в раскрывающемся списке не нуждаются в дополнительном пространстве, выделение фактически сжимается, что выглядит странно.
Эта версия устраняет обе эти проблемы:
if($.browser.msie) {
/* IE obscures the option text for fixed-width selects if the text
* is longer than the select. To work around this we make the width
* auto whenever the drop down is visible.
*/
$("select.fixed-width").livequery(function(){
/* Use mousedown rather than focus because the focus event gets
* interrupted and the dropdown does not appear
*/
$(this)
.mousedown(function(){
if($(this).css("width") != "auto") {
var width = $(this).width();
$(this).data("origWidth", $(this).css("width"))
.css("width", "auto");
/* if the width is now less than before then undo */
if($(this).width() < width) {
$(this).css("width", $(this).data("origWidth"));
}
}
})
/* Handle blur if the user does not change the value */
.blur(function(){
$(this).css("width", $(this).data("origWidth"));
})
/* Handle change of the user does change the value */
.change(function(){
$(this).css("width", $(this).data("origWidth"));
});
});
}
Протестировано в IE6-8
Кажется, это хорошо работает, заставляя IE переоценивать ширину выбора. Работает в IE7 и IE8.
if (jQuery.browser.msie) {
jQuery("#" + selectID).css("width", "100%").css('width', 'auto');
}