Событие захвата 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!");
    };
}-*/;
Другие вопросы по тегам