如何从GWT中调用jQuery的触发器(trigger)?

12
  public static native void doConnect() /*-{
            $wnd.jQuery(document).trigger('connect',
                    {
                    jid: 'sss',
                    password: 'sss'
                }

                );

        }-*/;

我尝试了上述方法,但是在firebug或gwt hosted模式控制台没有报错(所以我无法知道代码是否成功)。请问这是调用jQuery触发器的正确方式吗?但是当我在bind('connect')中放置alert()时,它没有被调用。

.js文件内部

    $(document).bind('connect', function (ev, data) { 
alert('not call.....at all');

        var conn = new Strophe.Connection(
            "http://bosh/xmpp-httpbind");

        conn.connect(data.jid, data.password, function (status) {
            if (status === Strophe.Status.CONNECTED) {
                $(document).trigger('connected');
            } else if (status === Strophe.Status.DISCONNECTED) {
                $(document).trigger('disconnected');
            }
        });

        Hello.connection = conn;
    });
2个回答

12

我在使用jQuery UI和GWT时遇到了类似的问题 - 在控制台/开发模式中没有错误,但是代码并不像我所想的那样运行。原因是jQuery(以及其他框架)扩展/更改了许多JavaScript的核心元素,并期望它保持不变 - 然而,GWT代码(也就是JSNI的内容)是从一个“干净”的iframe中执行的(这样就不会出现外部框架混乱语言并在GWT中引起一些奇怪的错误,这就是为什么你必须通过$wnd引用到主窗口)。

我建议将你的doConnect函数移到主页面(或链接到主页面的外部js文件)中,并从你的JSNI存根中调用该函数:

public static native void doConnect() /*-{
   $wnd._doConnect('sss','sss'); //_doConnect defined in the host page
}-*/;

或者提供辅助函数,从宿主页面返回包含所有jQuery所做和期望的更改的数组等。


4

虽然现在回答有些晚了,但你原始的代 码没有起作用是由于一个简单的错误:你正确地使用了$win而不是window,但几个字符后你使用了 document而不是$doc :)

public static native void doConnect() /*-{
    $wnd.jQuery($doc).trigger($wnd.jQuery.Event('connect', {
        jid: 'sss',
        password: 'sss'
    }));
}-*/;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接