将Skype按钮添加到HTML面板

时间:2014-02-23 19:01:18

标签: javascript html gwt jsni

我正在使用GWT开发WebApplication,并希望使用Skype URI,特别是生成的代码来自此生成器:SkypeButton

我使用HTML面板,因为它看起来像HTML一样工作(见下文)。我已经拥有的东西:

EntryClass

@Override
public void onModuleLoad() {
    HTMLPanel htmlPanel = new HTMLPanel("<h1>Headline</h1>");
    HTMLPanel skype = new HTMLPanel(
       "<script type=\"text/javascript\"
       src=\"http://www.skypeassets.com/i/scom/js/skype-uri.js\"></script>"
       + "<script type=\"text/javascript\">"
       + "Skype.ui({\"name\": \"call\",\"element\": "
       + "\"SkypeButton_Call_My.User_1\",\"participants\": "
       + "[\"My.User\"], \"imageSize\": 32 });"
       + " </script> ");
    skype.getElement().setId("SkypeButton_Call_My.User_1");
    RootPanel.get().add(htmlPanel);
    RootPanel.get().add(skype);
    }

当我运行此代码时,没有成功。这就是编译后HTML代码在浏览器中的样子。

开发人员工具(Chrome)

<div id="SkypeButton_Call_My.User_1">
   <script type="text/javascript" src="http://www.skypeassets.com/i/scom/js/skype-uri.js"></script>
   <script type="text/javascript">
      Skype.ui({
      "name": "call",
      "element":"SkypeButton_Call_My.User_1",
      "participants": ["My.User"], 
      "imageSize": 32 });
   </script> 
</div>

但是当我在index.html文件中使用上面的代码时,JS会从skype生成的代码中创建此代码:

开发人员工具(Chrome)

<a href="javascript://" 
  onclick="Skype.tryAnalyzeSkypeUri('call', '0');
  Skype.trySkypeUri_Generic('skype:My.User?call', '_detectSkypeClient_1393181312260', '0'); 
  return false;
">
<img src="http://www.skypeassets.com/i/scom/images/skype-buttons/callbutton_32px.png" 
  alt="Skype call" 
  role="Button" 
  style="border:0; 
  margin:32px; 
  vertical-align:-41px;">
</a>

我的猜测是我的应用程序没有像webserver那样执行生成的JS。

在我的研究之后,我发现主题JSNI可以适应,但我不知道如何将生成的代码放入我的项目中。 :(

有人可以帮我解决这个问题吗?一个例子或方向会很棒:)

1 个答案:

答案 0 :(得分:2)

您无法使用innerHTMLHTMLPanel使用)注入脚本。您必须以编程方式构造ScriptElement,或者使用GWT,您只需使用ScriptInjector(不要忘记setWindow(TOP_WINDOW))。

ScriptInjector.fromUrl("http://www.skypeassets.com/i/scom/js/skype-uri.js")
    .setWindow(ScriptInjector.TOP_WINDOW)
    .setCallback(new Callback<Void, Exception>() {
       @Override
       public void onSuccess(Void result) {
         ScriptInjector.fromString("Skype.ui({\"name\": \"call\",\"element\": "
             + "\"SkypeButton_Call_My.User_1\",\"participants\": "
             + "[\"My.User\"], \"imageSize\": 32 });")
             .setWindow(ScriptInjector.TOP_WINDOW)
             .inject();
       }
       @Override
       public void onError(Exception e) {
         GWT.reportUnhandledException(e);
       }
    })
    .inject();

(请注意IE上的setCallback,请参阅javadoc)