【问题标题】:Add Class to First / Last Elements Dynamically Generated by Each Loops将类添加到每个循环动态生成的第一个/最后一个元素
【发布时间】:2014-05-03 01:18:13
【问题描述】:

即使我的编码经验有限,这似乎也是一个相当愚蠢的问题,但如果我能自己或在这里找到解决方案,我该死的。我的 HTML 页面上有多个元素,其类为 .innertables。我基于一个单独的变量,将此类包装在动态生成的 HTML 中,如下所示:

var limit = 3 //dynamically generated, could be any integer
$( ".innertables" ).each(function() {
    var divs = $(this).children('.togcont').slice(0,limit); 
        for(var i = 0; i < limit; i++) {
            divs.wrapAll("<div class='wrap'><div class='pre'></div><div class='morecont'>More -&gt;</div><div class='lesscont'>&lt;- Back</div> </div>");
        }
    });

这会生成此示例 HTML sn-p 的多个实例:

<div class="innertables">
    <div class="wrap">
        <div class="pre">Header Text
            <div class="togcont">Text 1</div>
            <div class="togcont">Text 2</div>
            <div class="togcont">Text 3</div>
        </div>
        <div class="morecont">More -&gt;</div>
        <div class="lesscont">&lt;- Back</div>
    </div>
   <div class="wrap">
        <div class="pre">Header Text
            <div class="togcont">Text 4</div>
            <div class="togcont">Text 5</div>
            <div class="togcont">Text 6</div>
        </div>
        <div class="morecont">More -&gt;</div>
        <div class="lesscont">&lt;- Back</div>
    </div>
   <div class="wrap">
        <div class="pre">Header Text
            <div class="togcont">Text 7</div>
            <div class="togcont">Text 8</div>
            <div class="togcont">Text 9</div>
        </div>
        <div class="morecont">More -&gt;</div>
        <div class="lesscont">&lt;- Back</div>
    </div>
</div>

到目前为止,一切都很好。我想要做的是将第二个类添加到morecont 的第一个实例以及morecontlesscont 的每个.innertables 实例中的最后一个实例。似乎将以下内容添加到 .innertables 的每个循环中就可以了:

$( ".morecont" ).first().addClass( "shiftleft" ); 
$( ".lesscont" ).last().addClass( "hide" );
$( ".morecont" ).last().addClass( "hide" ); 

但这会将类添加到页面上所有.innertables 中的第一个.morecont,以及所有这些中的最后一个实例。我尝试了不同的方法,例如将.wrap 添加为第一堂课,例如$( ".wrap .morecont" ).first(),结果相同,类似$( ".wrap .morecont:first-child" ).addClass( "shiftleft" );,根本没有结果。我知道 .each() 循环将遍历 .innertables 的每个实例,并能够对每个循环的实例进行更改。我在这里做错了什么?

【问题讨论】:

    标签: jquery html addclass each css-selectors


    【解决方案1】:

    尝试使用 jQuery 的 each 函数。

    $(".innertables").each(function() {
       $(this).find(".morecont").first().addClass( "shiftleft" );
       $(this).find(".lesscont").last().addClass( "hide" );
       $(this).find(".morecont").last().addClass( "hide" );
    });
    

    这基本上告诉 jQuery 在每个.innertable 的范围内找到你想要的第一个/最后一个

    您做错了什么是您使用了.each() 循环,但您没有使用$(this).children( "selector" ) 缩小所选元素的范围。如果你直接使用$( "selector" ),即使它在.each()内部,它也不起作用。

    编辑:将.children() 更改为.find()

    【讨论】:

    • 您也许可以使用 :first 和 :last jquery 选择器以便在没有循环的情况下执行此操作?
    • 这是有道理的,但很遗憾地说,这不起作用——没有添加额外的类,即使我将$(this).children(".morecont").addClass( "shiftleft" ); 放入$(".innertables").each() 循环中也是如此。现在,如果我添加类似$( ".morecont" ).addClass( "shiftleft" ); 的内容,每个.morecont 元素都会获得一个额外的.shiftleft 类,但这当然不是我想要的。但是解决方案一定在那个$.each(),我不得不想象。
    • @jimiayler 哎呀。我仔细查看了您的代码,那是因为我们应该使用$(this).find() 而不是$(this).children(),因为children() 只查看元素的直接子元素。我已经编辑了我的原始答案,请参阅其中的新代码。
    • 好“发现”! :} 现在就像一个魅力。非常感谢您的帮助。
    猜你喜欢
    • 2016-02-22
    • 2015-04-18
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多