我正在尝试让 jquery 在使用 GWT 时为我做一些 ui 影响。我有添加到页面的通知,点击后应该会消失。由于可能有多个相同类型的通知(警告、错误等),我试图仅在通过 GWT 单击它们时才动态添加样式名称,然后让 jquery 对该特定类名称执行操作。
问题是 jquery 函数在添加样式名称之前触发,因此用户必须单击通知两次才能将其关闭。
有什么想法吗?
public abstract class AbstractNotificationWidget extends Composite implements ClickHandler, HasClickHandlers {
protected abstract String getUniqueId();
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
return addDomHandler(handler, ClickEvent.getType());
}
@Override
public void onClick(ClickEvent event) {
doClick(getUniqueId());
}
protected static native void doClick(String name) /*-{
$wnd.$("#" + name).click(function () {
$wnd.$(this).slideUp("slow");
$wnd.$("div", this).fadeOut("slow");
});
}-*/;
}
然后我有扩展上述类的子类
public class ErrorNotificationWidget extends AbstractNotificationWidget {
private final String uniqueId;
public ErrorNotificationWidget (String title, String message) {
uniqueId = DOM.createUniqueId();
initWidget(uiBinder.createAndBindUi(this));
this.getElement().setId(uniqueId);
this.addClickHandler(this);
}
@Override
protected String getUniqueId() {
return this.uniqueId;
}
这些子类使用 UIBinder 来确定它们应该如何绘制。然后将这些小部件添加到要显示的面板中。
最佳答案
您到底想达到什么目的?根据已应用的样式或它的 id 隐藏小部件? (在当前版本中,您似乎将一个与另一个混合在一起)
如果 ClickEvent
快速触发(可以通过在它之前添加超时来测试),您可以尝试将其包装在 DeferredCommand
中.
另一种可能性是 jQuery 正在崩溃 ;) 我在 jQuery/Mootools 中使用回调时遇到了一些奇怪的问题 - 原因是这些框架扩展/更改了 function()
(除其他外) ) - 然而,JSNI 的东西是从一个“干净的”iframe 执行的,jQuery 没有做任何更改(这就是为什么你必须通过 $wnd
引用主窗口)。例如,您可以通过在您的主机 HTML 页面中定义一个测试函数,然后将其作为回调函数传递到您的 void doClick(String name)
方法中来测试这是否是这里的问题:
protected static native void doClick(String name) /*-{
$wnd.$("." + name).click($wnd.jqueryTest); // BTW, why '"." + '?
}-*/;
我最初的建议仍然有效 - 使用 FocusPanel
作为您的主要小部件 - 根据我的经验,尝试正确实现HasClickHandlers
(和类似接口(interface))是一个 PITA,可能导致奇怪的错误和/或内存泄漏。
关于java - 让 JQuery 作用于 GWT 动态添加的类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2284635/