Ответ 1
Я решил создать jsFiddle с рабочим кодом для решения этой проблемы. Я также включаю код здесь, просто в случае, если jsFiddle появится в отдаленном будущем:
<ol class="ingredientList">
<li class="ingredient">Apples</li>
<li class="ingredient">Carrots</li>
<li class="ingredient">Clams</li>
<li class="ingredient">Oysters</li>
<li class="ingredient">Wheat</li>
</ol>
<ol class="ingredientList">
<li class="ingredient">Barley</li>
<li class="ingredient">Eggs</li>
<li class="ingredient">Millet</li>
<li class="ingredient">Oranges</li>
<li class="ingredient">Olives</li>
</ol>
и jQuery:
$(".ingredient").click(function(){
var element = $(this);
var added = false;
var targetList = $(this).parent().siblings(".ingredientList")[0];
$(this).fadeOut("fast", function() {
$(".ingredient", targetList).each(function(){
if ($(this).text() > $(element).text()) {
$(element).insertBefore($(this)).fadeIn("fast");
added = true;
return false;
}
});
if(!added) $(element).appendTo($(targetList)).fadeIn("fast");
});
});
Я сократил ваш HTML вниз ради краткости, поэтому вы захотите изменить свой код, чтобы он соответствовал вашим. Кроме того, если вы собираетесь использовать пользовательские атрибуты (которые не являются допустимыми HTML и официально не поддерживаются каким-либо браузером... хотя это тоже ничего не повредит... возможно), я рекомендую префикс их "data-", чтобы соответствовать спецификации HTML5 Custom Data Attribute. Таким образом, "componentent_id" станет "data-componentient_id". Хотя это еще не поддерживается в любом текущем браузере, поскольку HTML5 не был доработан, он безопаснее и надежнее, чем просто определяет ваши собственные атрибуты. И как только HTML5 будет завершен, ваши атрибуты будут полностью поддерживаться.
Изменить. Как отметил Джон в комментариях, это не сработает, если вам нужно поддерживать символы UTF-8. В этом случае вам нужно использовать String.prototype.localeCompare() (убедитесь, что вы проверяете, поддерживает ли браузер его в соответствии с документацией). Таким образом, код будет выглядеть примерно так:
$(".ingredient").click(function(){
var element = $(this);
var added = false;
var targetList = $(this).parent().siblings(".ingredientList")[0];
$(this).fadeOut("fast", function() {
$(".ingredient", targetList).each(function(){
if ($(this).text().localeCompare($(element).text()) > 0) {
$(element).insertBefore($(this)).fadeIn("fast");
added = true;
return false;
}
});
if(!added) $(element).appendTo($(targetList)).fadeIn("fast");
});
});