【问题标题】:How to use JavaScript callback function in GWT UiBinder?如何在 GWT UiBinder 中使用 JavaScript 回调函数?
【发布时间】:2014-04-26 14:41:12
【问题描述】:

我想在移动网页上进行 Facebook 登录。这可以通过Facebook Login Button 完成。它工作得很好。我的 GWT UiBinder 页面中有以下代码:

<g:HTMLPanel>
    <div class="fb-login-button" data-max-rows="1" data-size="xlarge" 
                data-show-faces="false" data-auto-logout-link="false" 
                data-scope="email,publish_actions,user_birthday,user_likes" 
                onlogin="alert('I am a JavaScript callback');"></div>

</g:HTMLPanel>

如果登录成功,则调用onlogin JavaScript 函数。

如何在调用此函数时以某种方式使用此回调函数来获得通知?有没有办法在这里使用 JSNI 或其他东西?

【问题讨论】:

    标签: java javascript html gwt jsni


    【解决方案1】:

    这是基于 logans 答案的正确工作版本。我添加了所需的实例变量,因为 myOnload() 方法是非静态的。我还添加了 $entry() 函数来跟踪 GWT 中的错误。

    class MyClass{
    
       MyClass(){
    
         expose();
    
         // UiBinder stuff here
       }
    
       // Call this once. Exports your Java method as a javascript method
       public native void expose()/*-{
           var instance = this;
           $wnd.myOnLoadThing = $entry(function(){
               instance.@com.my.MyClass::myOnload()();
           });
        }-*/;
    
       public void myOnload(){
           // Put your java onload function here
       };
    }
    

    在你的 uiBinder 中,确保调用 myOnLoadThing

    <g:HTMLPanel>
    <div class="fb-login-button" data-max-rows="1" data-size="xlarge" 
                data-show-faces="false" data-auto-logout-link="false" 
                data-scope="email,publish_actions,user_birthday,user_likes" 
                onlogin="window.myOnLoadThing();"></div>
    
    </g:HTMLPanel>
    

    这里也有一个很好的答案: How to call GWT java function from Javascript?

    【讨论】:

      【解决方案2】:

      在您的类中,您可以公开一个原生 javascript 方法,例如称为 myOnLoadThing

      class MyClass{
      
         MyClass(){
      
           expose();
      
           // UiBinder stuff here
         }
      
         // Call this once. Exports your Java method as a javascript method
         public native void expose()/*-{
             $wnd.myOnLoadThing = function(){
                  @com.my.MyClass::myOnload()();
             }
          }-*/;
      
         public void myOnload(){
             // Put your java onload function here
         };
      }
      

      在你的 uiBinder 中,确保调用 myOnLoadThing

      <g:HTMLPanel>
      <div class="fb-login-button" data-max-rows="1" data-size="xlarge" 
                  data-show-faces="false" data-auto-logout-link="false" 
                  data-scope="email,publish_actions,user_birthday,user_likes" 
                  onlogin="window.myOnLoadThing();"></div>
      
      </g:HTMLPanel>
      

      这里也有一个很好的答案: How to call GWT java function from Javascript?

      【讨论】:

      • 我想你错过了 var instance = this;
      • @confile 您不应进行更改答案含义的编辑。相反,您应该在 cmets 中指出您的更改/建议,并在他们同意的情况下允许原始发布者进行更改。如果您觉得变化足够大,也许您也可以创建自己的问题答案。
      • 感谢@Gaffi 指出这一点——我想知道这个线程发生了什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多