【问题标题】:Calling a javascript function out of java从 java 中调用 javascript 函数
【发布时间】:2012-07-20 06:42:58
【问题描述】:

我试图从我的 Vaadin Portlet 中调用一个 javascript 函数。

假设我的项目中有一个 HTML 文件;

主页.html

<html>  
   ...  
   <script type="text/javascript">  
   ...  
   function foo(String msg)   
   {  
      alert(msg);  
   }  
   ...  
  </script>  
   ...  
</html>  

通过Vaadin Embedded Browser 将页面嵌入到我的 Portlet 中

如何从我的 java 应用程序中调用函数 foo(String msg)

我需要导入/读取 homepage.html 文件并调用它还是我必须做的其他事情?

【问题讨论】:

  • 您的 Java 应用程序是同一页面上的小程序吗?
  • @Thilo 有点多,它是一个带有嵌入式浏览器的 Portlet,浏览器实际上加载了 html 页面
  • 带有嵌入式浏览器的portlet?您的意思是 iframe(由访问 portlet 的浏览器加载)?
  • @Thilo 看看这个,demo.vaadin.com/sampler#WebEmbed你也可以查看源代码
  • 啊,现在我们到了某个地方。添加 Vaadin 标记。

标签: java javascript vaadin jsni jsobject


【解决方案1】:

首先你需要得到脚本体; 那么您可以使用javax.script.ScriptEngineManager 来解决您的问题javax.script.*
伪代码

import javax.script.*;
ScriptEngine engine = 
            new ScriptEngineManager().getEngineByName("javascript");
String script = getScript(path_to_html);
            engine.eval(script);

【讨论】:

  • 然后是当脚本尝试与它可能认为是托管它嵌入它的 HTML 的 Web 浏览器交互时该怎么做的问题。请注意,示例脚本显示alert()。在这种情况下应该做什么?
  • 如果您的应用程序是applet,您可以在当前上下文中解析脚本和eval,如果您的应用程序是桌面应用程序,您可能需要嵌入一个webbrowser,如果您的应用程序是web项目,只需包含页面或获取脚本然后写入您的页面
  • 显然这是一个 Vaadin portlet 使用他们的 WebEmbed 组件:demo.vaadin.com/sampler#WebEmbed(我猜是 iframe)。
【解决方案2】:

将外部 javascript 文件包含到 Vaadin 应用程序中的最简单方法是覆盖 Application#writeAjaxPageHtmlVaadinScripts 方法。

要从 Vaadin 服务器端代码调用 javascript 函数,请调用 Window#executeJavascript

@Override
protected void writeAjaxPageHtmlVaadinScripts(Window window,
                                              String themeName, Application application, BufferedWriter page,
                                              String appUrl, String themeUri, String appId,
                                              HttpServletRequest request) throws ServletException, IOException {
  page.write("<script type=\"text/javascript\">\n");
  page.write("//<![CDATA[\n");
  page.write("document.write(\"<script language='javascript' src='" + appUrl + "/VAADIN/scripts/example.js'><\\/script>\");\n");
  page.write("//]]>\n</script>\n");
  super.writeAjaxPageHtmlVaadinScripts(window, themeName, application,
      page, appUrl, themeUri, appId, request);
}

注意:我从未将 Vaadin 用作 Portlet,但快速浏览一下应该可以正常工作。

但是,这种方法相当初级,仅适用于快速破解/概念验证:如果您想要更复杂的东西,那么开发自己的 Vaadin 小部件是正确的方法。它为您提供 GWT 和 JSNI 的强大功能,并为您提供更精细的控制:有关详细信息,请参阅 The Book Of Vaadin

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2019-12-13
    相关资源
    最近更新 更多