我们有一个基于 Web 的项目,但需要对用户的文件系统有大量访问权限。 HTML(还)不允许我们进行足够的访问,并且由于我们主要是一家 Grails 商店,因此将文件访问代码作为小程序比将其作为 Flash 代码更有意义。
我们已经接触过一些 Griffon(该项目之前的原型(prototype)是 100% Griffon Webstart 应用程序),并且喜欢 Griffon 为小程序提供的结构和“样板文件删除”。然而,我们不断遇到的问题是将 Html/JavaScript UI 连接到实际上完成所有工作的 Griffon 小程序。
我们找到了 James Williams 的 excellent example从 Griffon 应用程序调用 JavaScript 函数,但尚未找到相反的示例:从 JavaScript 端调用 Griffon 函数。
主要问题是我们希望 Griffon 应用程序“ headless ”(或尽可能接近),因为所有 UI 都将由 JavaScript 和 HTML 处理。这意味着我们无法使用 Griffon 应用程序内触发的 UI 事件,就像 James 在他的示例中所做的那样。
有谁有 JavaScript 与 Griffon 小程序交互的示例可供我们学习吗?或者关于如何将 Griffon 小程序中的内容呈现给 JavaScript 有什么建议吗?
最佳答案
听起来您想使用 JavaScript 从外部世界调用在 Applet 中找到的 Java(或 groovy!)函数,对吗?
为了使其发挥作用:
您必须启用 livescript,并且必须对小程序的 jar 进行签名。
下一步是在小程序子类中定义一个入口点,该入口点知道如何处理您想要进行的调用。
这就是棘手的地方,因为默认的 applet 类是
griffon.swing.SwingApplet
,因此您必须创建自己的griffon.swing.SwingApplet
子类并使用它作为主要入口点。您的子类将定义可从 JavaScript 端调用的方法。这应该是这样的:
import griffon.swing.SwingApplet; public class MySwingApplet extends SwingApplet { // match superclass constructors public CalculatorApplet(String[] args) { super(args); } public Object myAppletMethod(String[] args) { // args come form the JS world // do whatever is necessary here } }
要告诉 Griffon 使用我们的自定义小程序子类而不是默认子类,只需创建一个名为
griffon-app/scripts/_Events.groovy
的文件并放置里面有以下内容:eventPackageAppStart = { griffonAppletClass = 'calculator.CalculatorApplet' }
最后,从 javascript 获取 applet 对象,并使用您认为合适的任何值调用
myAppletMethod()
:<script> function talkToApplet() { var r = document.applets.myAppletId.myAppletMethod("arg1", "arg2"); alert(r); } </script>
一个more detailed example可以在 my blog 上找到.
关于java - 如何从 JavaScript 调用 Griffon 小程序中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17598609/