【问题标题】:jQuery .each loop one at a timejQuery .each 一次循环一个
【发布时间】:2013-11-14 03:24:42
【问题描述】:

我有一个 each 循环,通过一个特定的类 (.casebox)。它检查其他类,更改标题并通过 .load() 加载特定内容。

HTML

<div id="mainbody">
 <div class="halfbox">
                    <h4 class="box casetitle"></h4>
                    <div class="caseloader loader"><img src="<?php echo $url_resources_images; ?>ajax-loader.gif" alt="Loading..." /><br /><p>Please be patient, loading cases...</p></div>
                    <div class="casebox dashbox"></div>
                </div>
                <div class="halfbox">
                    <h4 class="box casetitle"></h4>
                    <div class="caseloader loader"><img src="<?php echo $url_resources_images; ?>ajax-loader.gif" alt="Loading..." /><br /><p>Please be patient, loading cases...</p></div>
                    <div class="casebox dashbox apending"></div>
                </div>

Javascript

function loadCases(){
$(".casebox").each(function(){
    getURLs();
    boxType();
    console.log('activated');
    div = $(this).parents('div').eq(0);
    div.css('background', 'blue');

    //BOXOVERIDE - FOR WHEN THE URL CAN'T BE SET E.G. DASHBOARD
    if($(this).hasClass("allopen")){
        div.find($('.casetitle').text('All Open Cases'));
        caseGET = "&casetype=allopen";
    } else if($(this).hasClass("copen")){
        div.find($('.casetitle').text('My Created Cases (Open)'));
        caseGET = "&casetype=copen";
    } else if($(this).hasClass("aopen")){
        div.find($('.casetitle').text('My Assigned Cases (Open)'));
        caseGET = "&casetype=aopen";
    } else if($(this).hasClass("allclosed")){
        div.find($('.casetitle').text('All Closed Cases'));
        caseGET = "&casetype=allclosed";
    } else if($(this).hasClass("cclosed")){
        div.find($('.casetitle').text('My Created Cases (Closed)'));
        caseGET = "&casetype=cclosed";
    } else if($(this).hasClass("aclosed")){
        div.find($('.casetitle').text('My Assigned Cases (Closed)'));
        caseGET = "&casetype=aclosed";
    } else if($(this).hasClass("apending")){
        div.find($('.casetitle').text('My Assigned Cases (Pending Close)'));
        caseGET = "&casetype=apending";
    }
    console.log(caseGET);
    $(this).load("boxes/cases.php?boxtype=" + boxtype + caseGET + orgGET, function (){
        div.find(".caseloader").hide();
    });
});
}

但是,它似乎运行得很快,当它进入第二个循环时,它似乎覆盖了第一次运行时所做的设置。第一次运行没有与 .hasClass 匹配的结果,其标题由函数 getURLS() 设置。然而,当第二个循环通过时,它会覆盖第一个框中的设置,并将标题设置为“我的分配案例(待处理)”,即使它只是具有此类的第二个框。最重要的是,第一个盒子加载了正确的内容,但加载栏没有消失,但第二个盒子的加载栏确实消失了。

关于如何确保它坚持的任何想法?这可能不是很清楚,但希望从上面的代码中,它将有助于解释。谢谢。

【问题讨论】:

  • 该代码很难阅读...您是否考虑过字典查找?您基本上创建了一个包含所有不同案例的对象,并为每个案例分配一个函数,然后根据字典查找当前类。它将显着提高您的代码可读性,并且可能还会提高代码大小。尽管在这种情况下,您可能只需要一个以类为键、文本为值的对象。
  • 第二个循环是什么意思?同样首先if 尝试在布尔值上使用find
  • 为什么你每次都在循环中调用getURLs()boxtype(),而不是在循环之前调用一次。
  • @elclanrs 这是我的计划,但需要在同一页面上使用可能不同类的多个框进行测试,然后再执行此操作,因为我还有一些要添加的内容。 charlietfl 删除,不应该在那里,复制/粘贴错误。
  • @jfriend00 因为每个框都可以不同,第一个框使用默认值获取其内容,但第二个框使用类手动设置。

标签: javascript jquery loops each


【解决方案1】:

我不确定 boxType、orgGet 来自哪里...但我认为问题在于,当您声明 $('.casetitle') 之类的内容时,它实际上会重新搜索整个文档以查找这些类。

尝试类似:

function loadCases(){
    $(".casebox").each(function(){
        getURLs();
        boxType();
        console.log('activated');

        //parent halfbox - only get the first parent
        var parent = $(this).parent('.halfbox');
        parent.css('background', 'blue');

        //seems that you try to get the casetitle all the time
        //find the element with the class casetitle, which is inside the parent
        var ct = parent.find('.casetitle');

        //BOXOVERIDE - FOR WHEN THE URL CAN'T BE SET E.G. DASHBOARD

        if($(this).hasClass("allopen")){
            //change the html inside the h4
            ct.html('All Open Cases');
            caseGET = "&casetype=allopen";
        } else if($(this).hasClass("copen")){
            ct.html('My Created Cases (Open)');
            caseGET = "&casetype=copen";
        } else if($(this).hasClass("aopen")){
            ct.html('My Assigned Cases (Open)');
            caseGET = "&casetype=aopen";
        } else if($(this).hasClass("allclosed")){
            ct.html('All Closed Cases');
            caseGET = "&casetype=allclosed";
        } else if($(this).hasClass("cclosed")){
            ct.html('My Created Cases (Closed)');
            caseGET = "&casetype=cclosed";
        } else if($(this).hasClass("aclosed")){
            ct.html('My Assigned Cases (Closed)');
            caseGET = "&casetype=aclosed";
        } else if($(this).hasClass("apending")){
            ct.html('My Assigned Cases (Pending Close)');
            caseGET = "&casetype=apending";
        }
        console.log(caseGET);

        $(this).load("boxes/cases.php?boxtype=" + boxtype + caseGET + orgGET, function (){
            parent.find('.caseloader').hide();
        });
    });
};

【讨论】:

  • 太棒了@Greg 我必须给你额外的荣誉来弄清楚那个代码:)
猜你喜欢
  • 1970-01-01
  • 2012-12-07
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多