这是我最终解决问题的方法(感谢上面 Arthur 的回复):
public class NewSection implements EntryPoint {
private static RichTextAreaWithFormatBar rta;
private Button pseudoSubmit;
@Override
public void onModuleLoad() {
invokeExternal("hello");
rta = new RichTextAreaWithFormatBar();
pseudoSubmit = new Button(">>>");
<...>
}
<some other code here>
public static void addImage(String a) {
rta.textarea().setHTML(
rta.textarea().getHTML() + "<br /><img src=\"/cms/i/"+ a +"\" alt=\"\"><br />");
}
native void invokeExternal(String int1) /*-{
$wnd.externalJsFunction(function(int1) {
@ur.g05.smc.client.NewSection::addImage(Ljava/lang/String;)(int1);
});
}-*/;
}
这是我模板中的“手写”javascript:
(首先是在同一模板中创建图像列表的 FreeMaker 代码):
<#list images as i>
<td><img src="/cms/i/${i.keyString()}.t" alt='' onclick='addImage("${i.keyString()}.p");'/><br /><p>${i.fullWidth()}·${i.fullHeight()}</p><p>${i.previewWidth()}·${i.previewHeight()}</p><p>${i.thumbWidth()}·${i.thumbHeight()}</p></td>
</#list>
还有脚本本身:
<script language="javascript">
var callBackFunction;
function externalJsFunction(func) {
callBackFunction = func;
}
function addImage(imgid) {
callBackFunction(imgid);
}
</script>
实际上发生的是:
首先,我们创建一个图像列表,为每个图像添加一个“onClick”侦听器,并将每个相应图像的 url 作为参数。图像 url 由它们在数据存储中的键组成,加上“.t”用于缩略图,“.p”用于预览,而没有用于全尺寸图像。
每个图像都调用“addImage”函数。但是 addImage 函数必须知道 textarea,它不知道。为此,我们创建了“callBackFunction”变量和“externalJsFunction”,用于设置“callBackFunction”变量的值。并将其设置为作为参数得到的任何值。
现在,我们可以从 Widget 代码中调用 externalJsFunction 并将添加图像的函数传递给 textarea。但是,当richtextarea 不是静态的时,我无法使其工作。
基本上就是这样。
并感谢您的回复和投票:)