我有两个订单列表在彼此旁边.
当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.
奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.
我也尝试将所有内容读入数组,并将其排序在一起,以防止children()方法没有按照显示顺序返回任何东西,但是我仍然得到相同的结果.
这是我的jQuery:
function moveNode(node,to_list,order_by){ rightful_index = 1; $(to_list) .children() .each(function(){ var ordering_field = (order_by == "A") ? "ingredient_display" : "local_counter"; var compA = $(node).attr(ordering_field).toupperCase(); var compB = $(this).attr(ordering_field).toupperCase(); var C = ((compA > compB) ? 1 : 0); if( C == 1 ){ rightful_index++; } }); if(rightful_index > $(to_list).children().length){ $(node).fadeOut("fast",function(){ $(to_list).append($(node)); $(node).fadeIn("fast"); }); }else{ $(node).fadeOut("fast",function(){ $(to_list + " li:nth-child(" + rightful_index + ")").before($(node)); $(node).fadeIn("fast"); }); } }
这是我的html看起来像:
<ol> <li ingredient_display="Enriched Pasta" ingredient_id="101635" local_counter="1"> <span class="rank">1</span> <span class="rounded-corners"> <span class="plus_sign"> + </span> <div class="ingredient">Enriched Pasta</div> <span class="minus_sign"> - </span> </span> </li> </ol>
解决方法
我已经创建了一个
jsFiddle with working code来解决这个问题.我也在这里包括代码,以防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规范.所以“ingredients_id”将成为“data-ingredients_id”.虽然目前的浏览器尚未支持HTML5,但尚未确定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",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"); }); });
Here is an updated Fiddle implementing localeCompare.