更改 GWT 客户端的文件输入元素
File Input Element on change GWT client side
我正在使用 WebGL 将 post 处理效果应用于图像的 GWT 中制作客户端专用应用程序。我在这样的类型文件的文档中添加了一个InputElement
。
InputElement inputElement = InputElement.as(Document.get().createFileInputElement());
inputElement.setAccept("image/*");
Document.get().getBody().appendChild(inputElement);
然后我想给它添加一个 onchange 侦听器,因为 GWT 不支持它,所以我写了这个 JSNI 方法来做到这一点。
private native void registerOnChange(Main object, InputElement element) /*-{
if (!$wnd.update)
$wnd.update = $entry(object.@com.shc.cartoonizer.client.Main::updateImage(*)(element));
element.onchange = $wnd.update;
}-*/;
问题是,这会在文件更改时引发 JS TypeError。这是在控制台中抛出的错误。
Uncaught TypeError: Cannot read property 'apply' of undefined
apply_0_g$ @ Impl.java:247
entry0_0_g$ @ Impl.java:306
(anonymous function) @ Impl.java:72
我做错了什么吗?
$entry(object.@com.shc.cartoonizer.client.Main::updateImage(*)(element))
$entry
将一个函数作为输入,return 是一个函数,但是您传递了 updateImage
函数的结果。
因为 $entry
在传入的函数上调用 apply
,而你的 updateImage
可能有一个 void
return 类型(这意味着函数在 JS 中会隐式 return undefined
),你会得到一个 Cannot read property 'apply' of undefined
错误。
解决方案是向 $entry
传递一个将调用 updateImage
:
的函数
$entry(function() {
object.@com.shc.cartoonizer.client.Main::updateImage(*)(element);
})
话虽如此,您有什么理由不使用 FileUpload
小部件和 addChangeHandler
?
我正在使用 WebGL 将 post 处理效果应用于图像的 GWT 中制作客户端专用应用程序。我在这样的类型文件的文档中添加了一个InputElement
。
InputElement inputElement = InputElement.as(Document.get().createFileInputElement());
inputElement.setAccept("image/*");
Document.get().getBody().appendChild(inputElement);
然后我想给它添加一个 onchange 侦听器,因为 GWT 不支持它,所以我写了这个 JSNI 方法来做到这一点。
private native void registerOnChange(Main object, InputElement element) /*-{
if (!$wnd.update)
$wnd.update = $entry(object.@com.shc.cartoonizer.client.Main::updateImage(*)(element));
element.onchange = $wnd.update;
}-*/;
问题是,这会在文件更改时引发 JS TypeError。这是在控制台中抛出的错误。
Uncaught TypeError: Cannot read property 'apply' of undefined
apply_0_g$ @ Impl.java:247
entry0_0_g$ @ Impl.java:306
(anonymous function) @ Impl.java:72
我做错了什么吗?
$entry(object.@com.shc.cartoonizer.client.Main::updateImage(*)(element))
$entry
将一个函数作为输入,return 是一个函数,但是您传递了 updateImage
函数的结果。
因为 $entry
在传入的函数上调用 apply
,而你的 updateImage
可能有一个 void
return 类型(这意味着函数在 JS 中会隐式 return undefined
),你会得到一个 Cannot read property 'apply' of undefined
错误。
解决方案是向 $entry
传递一个将调用 updateImage
:
$entry(function() {
object.@com.shc.cartoonizer.client.Main::updateImage(*)(element);
})
话虽如此,您有什么理由不使用 FileUpload
小部件和 addChangeHandler
?