Событие захвата GWT в RichTextArea или в IFrame
У меня есть 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, предупреждение не срабатывает.
Любая идея, как захватить это событие вставки?
Спасибо!
3 ответа
Вы не можете добавить событие в 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());
Вы видели визуализированный HTML RichTextArea
? это iframe
не факт textarea input
тип. он устанавливает пользовательский ввод под body
элемент. Так вот почему ты не утонешь onpaste
События. Например, если вы слушаете onpaste
на TextArea
виджет работает нормально.
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);
}
}
может быть, вы можете привязать обработчик к этому элементу тела iframe с помощью JSNI и получить обратный вызов для этого события (хотя еще не пробовал)
Просто для полноты нативное (JSNI) решение будет выглядеть примерно так:
setPastehandler(richTextArea.getElement());
private native void setPasteHandler(Element e) /*-{
e.contentDocument.onpaste = function (event) {
alert("pasted!");
};
}-*/;