【问题标题】:Add .css() to prepended div将 .css() 添加到前置 div
【发布时间】:2013-04-16 03:11:47
【问题描述】:

这个prepend 函数添加了一个带有“colorBox”类的div,但是我在为新创建的div 设置css 时遇到了问题。我不知道我的语法是否完全正确,但我正在尝试在父 (li) 标记中使用 data-background 值。

我正在使用它向multiselectoptions 添加颜色框,并且我使用的插件将每个option 转换为<li>,其结构类似于我在下面包含的HTML。

JS

$(function(){
    $("li span").prepend('<div class="colorBox"></div>').css('background-color', $(this).parent().attr("data-background"));   
});

HTML

<ul>
    <li data-background="#C11B17">
        <input type="checkbox" name="color[]" value="Brick_Red">
        <span>Brick Red</span>
    </li>
</ul>

【问题讨论】:

标签: jquery css prepend


【解决方案1】:

尝试将您的代码拆分一下。它失败了,因为.css() 实际上是在父级上调用的,而this 在您的上下文中指的是window

jsFiddle

$(function(){
    // Get all elements matching selector 'li span'
    var spans = $("li span");
    // Loop for each element in spans
    spans.each(function () {
        // Create the new element as a jQuery object
        var elem = $('<div class="colorBox">test</div>');
        // Set the new element's background-color to the attribute on the parent
        // of the span
        elem.css('background-color', $(this).parent().attr("data-background"));
        // Prepend the new element to the span (insert it as the first child)
        $(this).prepend(elem);
    });
});

如果您要在div 中包含“Brick Red”,则需要使用.wrap().wrapInner()

jsFiddle

$(this).wrap(elem);

更新

如果您需要自定义复选框,我建议您采用更受 CSS 驱动的方法,该方法利用 &lt;label&gt; 标记。

jsFiddle

HTML

<ul>
    <li data-background="#C11B17">
        <input type="checkbox" name="color[]" value="Brick_Red" id="checkbox1" />
        <label for="checkbox1">
            <span>Brick Red</span>
        </label>
    </li>
</ul>

CSS

input[type=checkbox] {
    display:none;
}

input[type=checkbox] + label:before {
    display:inline-block;
    content:"";
    width:1em;
    height:1em;
    background-color:#CCC;
}

input[type=checkbox]:checked + label:before {
    background-color:#C11B17;
}

请注意,此方法将在 IE8+ 中有效,无需任何 polyfill。

【讨论】:

  • 我是追加/前置世界的新手,所以我在遵循逻辑时遇到了一些麻烦。麻烦你加几个cmets,让我明白背后的原理吗?
  • 更新,prepend表示作为第一个孩子插入,append表示作为最后一个孩子插入。
  • 如何让它显示一个复选框而不是一个文本框?我认为用我要解决的基本布局和你关于包装文本jsfiddle.net/chayacooper/NCSPE/1 的问题发布一个小提琴会很有帮助(我仍然需要玩弄将颜色框放在左边的位置复选框)。
  • @ChayaCooper 我用自定义复选框的建议更新了我的答案。
  • 没有:checked的目标指定未选中状态jsfiddle.net/htbH8/1
【解决方案2】:

如果你要使用 .css() 而不是 css,那为什么不直接使用 style 设置呢?

var color = $('li').attr('data-background');
$("span").prepend('<div class="colorBox" style="background:' + color + '"></div>');

【讨论】:

  • 我不知道我能做到这一点:-D
  • 请注意,这将为每个span 使用相同的颜色。如果您的lis 有不同的颜色,此方法将不起作用。
  • 它们确实有不同的颜色,但我假设我可以稍微不同地构造它,以便它引用那个
  • 但是由于某种原因,代码没有改变背景颜色:-(你介意看看这个小提琴吗?jsfiddle.net/chayacooper/NCSPE/2
  • 对 Daniel 来说,为什么不对所有这些都使用 css + 类呢?这样他们就不一样了。 ==> jsfiddle.net/Bushwazi/WmPwg
  • 【解决方案3】:

    在 jQuery 中,this 词是关于链中的最后一个对象。在您的示例中,$("li span") 是最后一个对象,因此当您使用“this”一词时,它大约是 $("li span")。 为避免这种情况,您可以简单地使用 prependTo 代替。这应该可以解决问题:

    jQuery(function(){
      jQuery('<div class="colorBox"></div>').prependTo(jQuery('#aaaa')).css(
      'background-color',jQuery(this).parent().attr("data-background"));   
    });
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签