使用jQuery动态插入到列表中

前端之家收集整理的这篇文章主要介绍了使用jQuery动态插入到列表中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个订单列表在彼此旁边.

当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.

奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.

我也尝试将所有内容读入数组,并将其排序在一起,以防止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">&nbsp;&nbsp;+&nbsp;&nbsp;</span>
          <div class="ingredient">Enriched Pasta</div> 
          <span class="minus_sign">&nbsp;&nbsp;-&nbsp;&nbsp;</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.

猜你在找的jQuery相关文章