Ele*_*ist 3 javascript tapestry
我使用 Maven 创建了一个新的 Tapestry 5.3 项目。我注意到 Tapestry 向所有页面添加了大量不同的 JS 和 CSS 文件:
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/default.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/ctx/layout/layout.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/tapestry-console.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/t5-alerts.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/tree.css"/>
<script src="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/underscore_1_3_3.js" type="text/javascript"></script>
<script src="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/scriptaculous_1_9_0/prototype.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)
还有很多很多……
这些是我的网站正常工作所必需的吗?如果没有,我该如何删除它们?我自己编写 JS 很舒服,我不需要 Tapestry 为我添加任何东西。
小智 5
有趣的是:Tapestry 提供了非常丰富的功能来覆盖默认服务行为,但在这种情况下不是。罪魁祸首 JavaScriptSupport 是动态创建的,无法进行修饰。
MarkupRendererFilter javaScriptSupport = new MarkupRendererFilter() {
public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer) {
DocumentLinker linker = environment.peekRequired(DocumentLinker.class);
//Surprise!;)
JavaScriptSupportImpl support = new JavaScriptSupportImpl(linker, javascriptStackSource, javascriptStackPathConstructor);
environment.push(JavaScriptSupport.class, support);
renderer.renderMarkup(writer);
environment.pop(JavaScriptSupport.class);
support.commit();
}
};
Run Code Online (Sandbox Code Playgroud)
所以唯一的方法是修补源代码(正如我们多次做过的那样),或者尝试覆盖作为 JavaScriptSupportImpl 参数的 javascriptStackSource:
你的 AppModule.java
@Decorate(serviceInterface = JavaScriptStackSource.class)
public JavaScriptStackSource decorateJavaScriptStackSource(JavaScriptStackSource original) {
return new MyJavaScriptStackSource(original);
}
Run Code Online (Sandbox Code Playgroud)
我的JavaScriptStackSource.java
public class MyJavaScriptStackSource implements JavaScriptStackSource {
// This bunch of stacks comes from got5
private Set<String> SKIP = new HashSet<String>(Arrays.asList("Slider", "AjaxUploadStack", "DataTableStack", "FormFragmentSupportStack", "FormSupportStack",
"SuperfishStack", "JQueryDateFieldStack", "GalleryStack"));
private class JavaScriptStackWraper implements JavaScriptStack {
private final JavaScriptStack original;
JavaScriptStackWraper(JavaScriptStack original) {
if (original != null) {
System.out.println("Wrap " + original.getClass().getName());
}
this.original = original;
}
@Override
public List<String> getStacks() {
return original != null ? original.getStacks() : Collections.<String>emptyList();
}
@Override
public List<Asset> getJavaScriptLibraries() {
return original != null ? original.getJavaScriptLibraries() : Collections.<Asset>emptyList();
}
// Always return empty list
@Override
public List<StylesheetLink> getStylesheets() {
return Collections.<StylesheetLink>emptyList();
}
@Override
public String getInitialization() {
return original != null ? original.getInitialization() : null;
}
}
private final JavaScriptStackSource original;
public MyJavaScriptStackSource(JavaScriptStackSource original) {
this.original = original;
}
@Override
public JavaScriptStack getStack(String name) {
JavaScriptStack stack = original.getStack(name);
if (!SKIP.contains(stack.getClass().getSimpleName())) {
return new JavaScriptStackWraper(stack);
}
return new JavaScriptStackWraper(null);
}
@Override
public List<String> getStackNames() {
return original.getStackNames();
}
Run Code Online (Sandbox Code Playgroud)
}
这是一大段糟糕的代码,但它有效.. 我想对在 Tapestry 中显示在我的页面中的内容有更多的控制。
| 归档时间: |
|
| 查看次数: |
1689 次 |
| 最近记录: |