【问题标题】:How to remove a CSS class from a Wicket component?如何从 Wicket 组件中删除 CSS 类?
【发布时间】:2012-04-13 05:40:09
【问题描述】:

使用AttributeAppender 将 CSS 类动态添加到 Java 代码中的组件非常简单:

component.add(new AttributeAppender("class", true, new Model<String>("foo"), " "));

或者,如果您已将上述内容提取到适当的实用方法或类中,则只需:

component.add(WicketUtils.cssClassAppender("foo"));

但是如何删除 CSS 类?

您可以通过完全清除 class 属性轻松删除 所有 CSS 类:

component.add(new SimpleAttributeModifier("class", ""));

...但如果组件有其他您不希望删除的 CSS 类,这是不可接受的。

Wicket 1.4(但也可以随意发布针对更高版本的建议)。

【问题讨论】:

  • 没用,嗯 - 想详细说明,否决者?恕我直言,在 SO 上记录 Wicket 的非立即显而易见的方面(对我自己和其他人)很有用。

标签: java css wicket


【解决方案1】:

这是我想出的一种方法:

public class CssClassRemover extends AttributeModifier {
    public CssClassRemover(String cssClass) {
        super("class", false, new Model<String>(cssClass));
    }

    @Override
    protected String newValue(String currentValue, String valueToRemove) {
        // NB: naive approach; breaks with e.g. "foo foo-bar" & "foo"
        return currentValue.replaceAll(valueToRemove, "");
    }
}

使用上述帮助程序的代码将是:

component.add(new CssClassRemover("foo"))

(当然您也可以根据需要创建匿名的 AttributeModifier 子类,但是将逻辑放在单独的实用程序类或方法中会清理很多。)

编辑newValue() 的改进版本,可以更好地处理极端情况(参见 biziclop 的评论)。注意:使用Guava。 (欢迎您发布更简单的(正则表达式?)版本。)

@Override
protected String newValue(String currentValue, String valueToRemove) {
    if (currentValue == null) return "";

    Set<String> classes = Sets.newHashSet(Splitter.on(" ").split(currentValue));
    classes.remove(valueToRemove);
    return Joiner.on(" ").join(classes); 
}

【讨论】:

  • 随时发布更好/更简单的方法来做到这一点。特别是如果我忽略了内置 Wicket 的类似内容...
  • 根据用例,也可以使用AttributeModifier 并决定在IModel 中使用哪些类。
  • 你应该在valueToRemove的开头和结尾添加空格(和字符串开始/结束)匹配,只要考虑class="foo foo-bar"的情况如果你使用currentValue.split( "\\s+" )来获取所有各个类,然后在没有要删除的类的情况下重新附加它们。为了获得奖励,您还可以对 valueToRemove 执行相同操作,以便能够使用单个 CssClassRemover 删除多个类。
  • @biziclop:好电话!我不是正则表达式细节的忠实拥护者,所以我很快编写了一个应该相当健壮的 Guava 版本。如果有人不喜欢它,欢迎竞争实施。 :-)
  • 好吧,如果您仍然使用 Guava,这很容易。 :)
【解决方案2】:

Jonik's answer 的基础上,以下添加了负前瞻以忽略不同样式类中间出现的事件(并且不区分大小写)。

public class StyleClassRemover extends AttributeModifier {

    public StyleClassRemover(final String cssClass) {
        super("class", false, Model.of(cssClass));
    }

    @Override
    protected String newValue(final String currentValue, final String valueToRemove) {
        if (currentValue == null) {
            return "";
        }

        final String patternString = "(^|\\s+)" + Pattern.quote(valueToRemove) + "(?!\\S)";
        return Pattern.compile(patternString, Pattern.CASE_INSENSITIVE).matcher(currentValue).replaceAll("");
    }
}

测试输入: http://fiddle.re/ah0ca6

【讨论】:

    【解决方案3】:

    Wicket 1.5+ 有 org.apache.wicket.AttributeModifier#remove()

    【讨论】:

    • 嗯,查看javadoc(“创建一个属性修饰符,删除具有指定名称的属性”),它似乎没有做我想要的......听起来它会删除完全“类”属性,就像问题中的 SimpleAttributeModifier 示例一样。
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多