Я создал 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 и официально не поддерживаются ни одним браузером ... хотя это также ничего не помешает ... вероятно), я рекомендую ставить перед ними " «для соответствия спецификации HTML5 Custom Data Attribute . Таким образом, «component_id» станет «data-ингридиент_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");
});
});
Вот обновленный Fiddle, реализующий localeCompare .