在RichTextArea或IFrame中的GWT捕获事件
我有一个RichTextArea
private RichTextArea richTextArea;
我试图捕获这样的粘贴事件:
DOM.sinkEvents((com.google.gwt.user.client.Element) richTextArea.getElement(), com.google.gwt.user.client.Event.ONPASTE);
DOM.setEventListener((com.google.gwt.user.client.Element) richTextArea.getElement(), new EventListener(){
@Override public void onBrowserEvent(Event event) {
switch (event.getTypeInt()) {
case Event.ONPASTE: Window.alert("hey");break;
}
}
});
但它不起作用,当我在richTextArea上粘贴文本时,不会触发警报。
任何想法如何捕捉这个粘贴事件?
谢谢!
您不能将事件添加到RichTextArea
,它实际上是一个iframe
,而是它的正文。
尽管你可以使用jsni
,但我会使用gwtquery,因为它的简单性:
// First attach the widget to the DOM
RootPanel.get().add(richTextArea);
// We only can bind events to the content, once the iframe document has been created,
// and this happens after it has been attached. Note that richtTextArea uses a timeout
// to initialize, so we have to delay the event binding as well
$(richTextArea).delay(1, lazy().contents().find("body").bind(Event.ONPASTE, new Function(){
@Override public boolean f(Event e) {
Window.alert("OnPaste");
return true;
}
}).done());
你看过RichTextArea
的呈现HTML吗? 它是一个iframe
而不是实际的textarea input
类型。 它将用户输入设置在body
元素下。 所以这就是为什么你不会onpaste
事件中。 例如,如果您在TextArea
小部件上倾听onpaste
,它可以正常工作。
private static class MyTextArea extends TextArea
{
public MyTextArea()
{
sinkEvents(Event.ONPASTE);
}
@Override
public void onBrowserEvent(Event event)
{
if(event.getTypeInt() == Event.ONPASTE)
{
Window.alert("text pasted !");
}
super.onBrowserEvent(event);
}
}
也许你可以使用JSNI将一个处理程序绑定到该iframe body元素,并获取该事件的回调(虽然还没有尝试过)
为了完整起见,本机(JSNI)解决方案将如下所示:
setPastehandler(richTextArea.getElement());
private native void setPasteHandler(Element e) /*-{
e.contentDocument.onpaste = function (event) {
alert("pasted!");
};
}-*/;
链接地址: http://www.djcxy.com/p/65469.html