我正在使用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可以适应,但我不知道如何将生成的代码放入我的项目中。 :(
有人可以帮我解决这个问题吗?一个例子或方向会很棒:)
答案 0 :(得分:2)
您无法使用innerHTML
(HTMLPanel
使用)注入脚本。您必须以编程方式构造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)