Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery:插入a<;李>;按顺序标记到列表中_Jquery_Insert - Fatal编程技术网

jQuery:插入a<;李>;按顺序标记到列表中

jQuery:插入a<;李>;按顺序标记到列表中,jquery,insert,Jquery,Insert,我有一个标签的订单: var order = ["a-link", "b-link", "c-link", "d-link", "e-link", "f-link"]; 某些标记在任何给定时刻都可能在列表中,也可能不在列表中: i、 e 我想说的是,按正确的顺序插入一个标记 <ul> <li id="a-link"></li> <!-- i'd like to insert <li id="b-link">

我有一个
  • 标签的订单:

    var order = ["a-link", "b-link", "c-link", "d-link", "e-link", "f-link"];
    
    某些
  • 标记在任何给定时刻都可能在列表中,也可能不在列表中:

    i、 e

    我想说的是,按正确的顺序插入一个
  • 标记

        <ul>
            <li id="a-link"></li> 
    <!-- i'd like to insert <li id="b-link"> right after this -->
            <li id="d-link"></li>
        </ul>
    
    有时我的列表可能如下所示:

        <ul>
        <li id="b-link"></li>
    
    <!-- but maybe I want to insert a <li id="d-link"> here-->
    
        <li id="e-link"></li>
        </ul>
    
        <ul>
        <li id="a-link"></li>
        <li id="d-link"></li>
    <!-- but maybe I want to insert a <li id="e-link"> here-->
        <li id="f-link"></li>
        </ul>
    
    或者像这样:

        <ul>
        <li id="b-link"></li>
    
    <!-- but maybe I want to insert a <li id="d-link"> here-->
    
        <li id="e-link"></li>
        </ul>
    
        <ul>
        <li id="a-link"></li>
        <li id="d-link"></li>
    <!-- but maybe I want to insert a <li id="e-link"> here-->
        <li id="f-link"></li>
        </ul>
    
    基本上,列表可能会更改…但每当我想插入一个
  • 标记(一次一个)时,它需要以正确的顺序作为顺序数组放置。

    要为相关更新信息添加解决方案:

    var ul=document.getElementsByTagName('ul')[0],
    lis=ul.getElementsByTagName('li'),
    订单=[“a-link”、“b-link”、“c-link”、“d-link”、“e-link”、“f-link”],
    toInsert=“b-link”,
    i=$.inArray(toInsert,订单),
    el=lis[toInsert],
    新力,;
    如果(!el&&i>-1){
    do el=lis[订单[++i]];
    而(i
    这利用了“活动”列表,以及列表中的元素可以通过使用其ID作为列表属性来访问这一事实


    原始答案:

    这应该做到:

    var order = ["a-link", "b-link", "c-link", "d-link", "e-link", "f-link"],
        i = 0,
        place = $('ul'),
        el = $('#' + order[i] );
    
    if( !el.length ) {
    
        $('<li>',{id:order[i]}).prependTo( place );
    
    } else {
    
        do {
            ++i;
            place = el;
            el = $('#' + order[i] );
        } while( el.length )
    
        if( i < order.length ) {
            $('<li>',{id:order[i]}).insertAfter( place );
        }
    }
    
    var顺序=[“a-link”、“b-link”、“c-link”、“d-link”、“e-link”、“f-link”],
    i=0,
    地点=$('ul'),
    el=$(“#”+订单[i]);
    如果(!el.length){
    $(“
  • ”,{id:order[i]}).prependTo(place); }否则{ 做{ ++一,; 地点=el; el=$(“#”+订单[i]); }while(el.length) 如果(i”,{id:order[i]}); } }

  • 下面是另一种方法:

    var顺序=[“a-link”、“b-link”、“c-link”、“d-link”、“e-link”、“f-link”],
    前,
    el;
    $。每个(顺序、功能(i、v){
    prev=el;
    el=$('#'+v);
    如果(!el.length){
    如果(!i){
    $(“
  • ”,{id:order[i],text:order[i]}); }否则{ $(“
  • ”,{id:order[i],text:order[i]}); } 返回false; } });

  • 我对这个问题的理解似乎与其他回答者不同(这是一个词吗?)


    我对这个问题的理解是,您希望在已经存在未知数量的其他元素的页面中插入单个元素。您希望将此单个元素按数组定义的顺序插入列表中


    编辑:另一个性能更好的选项是在要插入的元素的顺序数组中查找索引。然后从该索引循环到最后。一旦找到存在的元素,就在该元素之前插入新元素

    var顺序=[“a-link”、“b-link”、“c-link”、“d-link”、“e-link”、“f-link”];
    var toInsert=“c-link”;
    var insertIndex=订单indexOf(toInsert);
    如果($((“ul>li”)。长度===0){
    $(“ul”).append($(“
  • ”,{id:toInsert})); }else if($(“#”+toInsert).length==0){ 插入的var=false; 对于(变量i=插入索引+1,len=order.length;i 0){ $el.before($(“
  • ”,{id:toInsert})); 插入=真; 打破 } } 如果(!插入){ //应该是最后一个 $(“ul”).append($(“
  • ”,{id:toInsert})); } }
  • 为了获得更好的性能,请确定元素的索引是在数组的中间点之前还是之后,并根据循环的迭代次数较少的情况向前或向后循环


    如果这是一个问题,这里有一个暴力的方式来做到这一点。如果列表比给定的示例大得多,则性能可能不太好


    Array.indexOf
    可能不受某些IE版本的支持,因此可能必须用其他内容替换它。

    顺序中只有少数(12个以下)元素,因此我认为提供的解决方案效果良好。但是很高兴知道其他的优化,所以感谢您提供这些信息。“与其他答案不同”我是这里唯一的其他答案,但是我们的解决方案表现相同。你指的是别人的回答吗?(我还看不到被删除的。)@RightSaidFred有多个被删除的答案。你的,我没有机会完全检查。@JamesMontagne:好的。谢谢你的信息。我想我记得见过一个人,但我从来没有真正看过。除了
    I=0
    ,我似乎失败了@JamesMontagne:我不知道你的意思<代码>i
    是分析的起点,因此它永远不应该被更改。哦,那么OP想确定要插入的代码吗?这个问题听起来像是自然顺序中的下一个问题。我猜不会。你必须为我澄清一些事情,你可能想在你的问题中澄清一下,以供将来的读者阅读。您是说要插入订单中缺少的第一个,还是说要手动选择要插入的,并将其放在正确的位置?你给出的例子可以用任何一种方式来解释。我补充了一些其他的例子,谢谢。
    var order = ["a-link", "b-link", "c-link", "d-link", "e-link", "f-link"],
        prev,
        el;
    
    $.each( order, function(i,v) {
        prev = el;
        el = $('#' + v);
        if( !el.length ) {
            if( !i ) {
                $('<li>',{id:order[i],text:order[i]}).appendTo('ul');
            } else {
                $('<li>',{id:order[i],text:order[i]}).insertAfter( prev );
            }
            return false;
        }
    });
    
    var order = ["a-link", "b-link", "c-link", "d-link", "e-link", "f-link"];        
    
    var toInsert = "c-link";
    var insertIndex = order.indexOf(toInsert);
    
    if($("ul>li").length === 0){
    
        $("ul").append(  $("<li>",{id:toInsert}));
    
    }else if($("#"+toInsert).length===0){
        var inserted = false;
    
        for(var i = insertIndex + 1, len = order.length; i<len; i++){
            var $el = $("#" + order[i]);
    
            if($el.length > 0){
                $el.before($("<li>",{id:toInsert}));
                inserted = true;
                break;
            }
        }
    
        if(!inserted){
             // should be last
              $("ul").append($("<li>",{id:toInsert}));
        }
    }