在Javascript中,我正在制作SVG形状并向其添加点击处理程序,如下所示:
var rect = document.createElementNS('http://www.w3.org/2000/svg','rect');
rect.addEventListener('click', myClickHandler, false);
这很好。我正在尝试在GWT中制作一个Rect类叠加层。如果可能的话,我只想做这样的事情:
public class SVGRect extends JavaScriptObject {
public native void addClickHandler(ClickHandler handler) /*-{
addEventListener('click', handler, false);
}-*/;
}
这样,我可以将“普通” GWT处理程序传递给此类,并从外部将其用作任何其他普通GWT UI元素。我不确定如何将ClickHandler对象连接到该对象的本机javascript实现?
谢谢
因为您需要ClickEvent
传递给ClickHandler.onClick
JavaScript并从JavaScript中获取它,所以会造成问题(AFAICT)-我将采用一种稍微不同的,更“通用”的方法:
创建一个简单的回调接口:
public interface Callback {
void execute();
}
然后,您可以直接传递它并按如下方式调用它:
public native void addClickHandler(Callback callback) /*-{
addEventListener('click', function() {
[email protected]::execute()();
}, false);
}-*/;
或创建一个中间步骤:
public void addClickHandler(Callback callback) {
_addClickHandler(getCallback(callback));
}
private native void _addClickHandler(JavaScriptObject callback) /*-{
addEventListener('click', callback, false);
}-*/;
// This can be moved to a better place
private native static JavaScriptObject getCallback(Callback callback) /*-{
return function()
{
[email protected]::execute()();
};
}-*/;
而且,当然,您会像这样使用它:
SVGRect svg = getMeSVGRect();
svg.addClickHandler(new Callback() {
@Override
public void execute() {
// Do some stuff
}
});
就个人而言,我更喜欢第二种解决方案-虽然它包含更多代码,但我希望将本机/ JSNI方法保持私有状态(除非它是一个覆盖对象或类似的东西),并且代码更具可读性且不易出错(无需使用从本地/ JSNI代码内部调用Java函数的时髦语法)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句