15

使用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(但也可以随意发布针对更高版本的建议)。

4

3 回答 3

17

这是我想出的一种方法:

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 的评论)。注意:使用番石榴。(欢迎您发布更简单的(正则表达式?)版本。)

@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); 
}
于 2012-04-13T05:45:14.157 回答
3

Jonik 的回答的基础上,以下添加了否定前瞻以忽略不同样式类中间的出现(并且不区分大小写)。

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

于 2015-05-08T13:28:41.653 回答
0

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

于 2012-04-13T14:24:57.433 回答