开发者

Wrap elements in div and add class based on label

开发者 https://www.devze.com 2023-01-16 20:31 出处:网络
Here is my markup, it\'s generated from a CMS and I can\'t do much with this at all. <div id=\"wrapper\">

Here is my markup, it's generated from a CMS and I can't do much with this at all.

<div id="wrapper">
<dl>
    <dt>
        <label>Awesomeness<span class="required"> *</span></label>
    </dt>
    <dd>Something here</dd>

    <dt>
        <label>Label Here</label>
    </dt>
    <dd>Something here</dd>
</dl>

<dl>
    <dt>
        <label>Awesomeness<span class="required"> *</span></label>
    </dt>
    <dd>Something here</dd>

    <dt>
        <label>Label Here</label>
    </dt>
    <dd>Something here</dd>

    <dt>
        <label>Here is another label<span class="required"> *</span></label>
    </dt>
    <dd>Something here</dd>
</dl>
</div>

I want to wrap a div around each dt and dd. I also want the div to have a class of the label, replacing spaces with a hyphen or underscore.

Looking at the first dl, here's how I'd like it to look.

    <dl>
    <div class="awesomness">
        <dt>
            <label>Awesomeness<span class="required"> *</span></label>
        </dt>
        <dd>Something here</dd>
    </开发者_JS百科div>

    <div class="label-here">
        <dt>
            <label>Label Here</label>
        </dt>
        <dd>Something here</dd>
    </div>
</dl>

Here's what I got. It wraps a div around every other dt/dd pair. I doesn't add a class name to the div yet either.

jQuery('#wrapper dl').each(function(){
    jQuery(this).addClass('testing');
});

var dts = jQuery("dt");
for(var i=0; i<dts.length;){
    i += dts.eq(i).nextUntil('dt').andSelf().wrapAll('<div />').length;
}


$('dl').each(function() {
  $(this).children('dt').each(function() {
     var $dt = $(this),
         $dd = $dt.next('dd');

     if($dd.length) {
        $dt.add($dd).wrapAll('<div class="' + $dt.children('label').contents().first().text() + '">');
     }
  });
});

Doh it's untested, but I will right now. Should get close to it.

http://www.jsfiddle.net/AKpv2/

Looks good to me.


jAndy comes close, I think. He's missing the class names and a little sanitation:

$(document).ready(function() {
    $('dt').each(function() {
        var $dt = $(this),
            $selection = $dt.next('dd').andSelf();

        $selection.wrapAll('<div class="' + $dt.find('label').text().replace(/[^a-z]/gi,'').toLowerCase() + '">');
    });
});
0

精彩评论

暂无评论...
验证码 换一张
取 消