2012-10-10 31 views
0

GWT新手,但我很喜歡它。我確實有一個很容易重現的問題。這對我來說是一個很大的問題,因爲我想爲PubNub創建一個GWT模塊 - 這是我們內部使用的實用程序。GWT腳本注入失敗與PubNub

我創建了一個演示項目來測試封裝,我發現ScriptInjector/Pubnub有一個有趣的問題。

起初我遵循PubNub指示。注意:我已將我的密鑰包含在我的測試帳戶中。隨意使用它們。

關注中(指定用我的鑰匙),我就把這兩個項目在HTML文件中的GWT項目的說明:

<div pub-key="pub-b8b75fbd-c4cf-4583-bab9-424af7a7f755" sub-key="sub-5e843c94-1193-11e2-bba9-b116c93082cf" ssl="off" origin="pubsub.pubnub.com" id="pubnub"></div> 
<script src="http://cdn.pubnub.com/pubnub-3.1.min.js"></script> 

當我這樣做,我可以用JSNI訪問pubnub。這一切都很好。

不起作用的是,如果我在這裏刪除標記並使用下面的代碼注入腳本。我知道該腳本會注入,因爲我可以看到成功消息,並且我可以在Chrome中的開發人員工具中看到該腳本。

  ScriptInjector.fromUrl("http://cdn.pubnub.com/pubnub-3.1.js").setCallback(
        new Callback<Void, Exception>() { 
        public void onFailure(Exception reason) { 
         Window.alert("Script load failed."); 
        } 
        public void onSuccess(Void result) { 
         Window.alert("Script load success."); 
        } 
        }).inject(); 

我覺得這必須以某種方式有關與延遲腳本訪問DOM,或因爲腳本是不是DOM的一部分。它試圖訪問設置格,它不能...(只是我的猜測)

有什麼想法?我需要將項目移出html文件,因爲我需要將此項目模塊化以用於其他大型項目。任何幫助,將不勝感激。 (PS,我也嘗試過創建html小部件,並將它們添加到EntryPoint中,這也會根據我在Chrome瀏覽器中的瀏覽器添加標籤到該頁面,但它無法工作,就像ScriptInjector失敗一樣。)

編輯:這是簡單的一個項目,我可以做演示問題:

HTML文件:

的結束標記上面:

<div pub-key="pub-b8b75fbd-c4cf-4583-bab9-424af7a7f755" sub-key="sub-5e843c94-1193-11e2-bba9-b116c93082cf" ssl="off" origin="pubsub.pubnub.com" id="pubnub"></div> 
<script src="http://cdn.pubnub.com/pubnub-3.1.min.js"></script> 
<script src="pubnubWrapper.js"></script> 

個pubnubWrapper.js(基本上是什麼在pubnub網站):

function subToPubNub(){ 
    PUBNUB.subscribe({ 
        channel    : "hello_world",      // CONNECT TO THIS CHANNEL. 
  
        restore    : false,              // STAY CONNECTED, EVEN WHEN BROWSER IS CLOSED 
                                         // OR WHEN PAGE CHANGES. 
  
        callback   : function(message) { // RECEIVED A MESSAGE. 
            alert(message); 
        }, 
  
        disconnect : function() {        // LOST CONNECTION. 
            alert(
                "Connection Lost." + 
                "Will auto-reconnect when Online." 
            ) 
        }, 
  
        reconnect  : function() {        // CONNECTION RESTORED. 
            alert("And we're Back!") 
        }, 
  
        connect    : function() {        // CONNECTION ESTABLISHED. 
  
            PUBNUB.publish({             // SEND A MESSAGE. 
                channel : "hello_world", 
                message : "Hi from PubNub." 
            }) 
  
        } 
    }) 
} 

ScriptTest.java:

public class ScriptTest implements EntryPoint { 
    public void onModuleLoad() { 
     //add a button to sub to pubnub 
     Button subButton = new Button("Sub"); 
     //add the event handler for button 
     subButton.addClickHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) { 
       //sub to pubnub 
       callSub(); 
      } 
      }); 
     RootPanel.get().add(subButton); 
    } 
    public native void callSub() /*-{ 
     //call my wrapper to pubnub 
     $wnd.subToPubNub(); 
    }-*/; 
} 

這所有的作品是。

如果從html文件中刪除pubnub腳本並將其添加到腳本注入器中,它將失敗。如果將腳本添加到gwt.xml文件中,則失敗。

任何想法?

回答

0

你可以發佈你的JSNI代碼嗎?
我敢打賭,您正在通過$wnd變量訪問PubNub嗎?
如果您將腳本標記放入模塊的xml文件中,pubnub代碼將加載到主機的頁面窗口中(您可以使用Chrome DeveloperTools進行檢查)。

ScriptInjector默認情況下不會加載它,但在GWT名稱空間中。 因此,爲了將其加載到主機的窗口命名空間,你必須在TOP_WINDOW傳遞給ScriptInjector

ScriptInjector.fromUrl("http://cdn.pubnub.com/pubnub-3.1.js").setCallback(
    new Callback<Void, Exception>() { 
     public void onFailure(Exception reason) { 
      Window.alert("Script load failed."); 
     } 
     public void onSuccess(Void result) { 
      Window.alert("Script load success."); 
     } 
}).setWindow(ScriptInjector.TOP_WINDOW).inject(); 
+0

想法很好,但你不能注入fromUrl到似乎TOP_WINDOW。我會試着將我的代碼放到一個超小的東西上,然後發佈到這裏。 – CharlieY

+0

你是什麼意思?根據[Javadoc](http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/core/client/ScriptInjector.FromUrl.html#setWindow(com.google.gwt) .core.client.JavaScriptObject))你可以注入到TOP_WINDOW中。 –

+0

對不起,我打錯了。您的代碼是正確的,並將其放入文檔的。注射仍然不起作用。我會提出簡單的項目來顯示問題。 – CharlieY