Поскольку я не получил никаких ответов, мне нужно было больше изучить эту проблему, поэтому я провел более глубокий анализ кода проекта gwtupload , чтобы понять, как GWT FileUpload (который преобразуется в) может быть украшен.
Оказалось, что element.click()
будет работать только в браузерах, которые поддерживают метод #click () (IE, Chrome, Safari). На самом деле, Мануэль Карраско Моньино, автор проекта, упоминает об этом в комментариях. Есть второй подход (для Firefox и Opera), который использует хак, когда FileInput помещается на прозрачную панель, которая, однако, размещается над какой-то украшенной кнопкой (с использованием абсолютного позиционирования); комментарий Мануэля:
Когда пользователь наводит указатель мыши на кнопку и нажимает на нее, на самом деле происходит то, что пользователь нажимает на прозрачный файл, отображающий диалоговое окно выбора файла.
После этого основная работа заключается в правильном применении атрибутов стиля к элементам.
Таким образом, существует две реализации пользовательского компонента загрузки файлов, и отложенное связывание GWT используется для их создания в зависимости от браузера.
Как, например, я упоминаю в своем вопросе, есть несколько исправлений (необходимо добавить «upload» в контейнер, и его можно установить в #setVisible (false)):
class MyUpload extends Composite {
private static native void clickOnInputFile(Element elem) /*-{
elem.click();
}-*/;
public MyUpload() {
final FileUploadWithMouseEvents upload = new FileUploadWithMouseEvents();
AbsolutePanel container = new AbsolutePanel();
container.add(upload);
upload.setVisible(false);
Button btn = new Button("My Browse..");
btn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
clickOnInputFile(upload.getElement());
}
});
container.add(btn);
initWidget(container);
}
}
Этот пример отлично работает в IE8.
P.S. Спасибо Мануэлю за его замечательную библиотеку:)