繁体   English   中英

将 Javascript 属性连接到 Java 对象

[英]Connecting Javascript properties to Java object

问题

我正在尝试将一个 Java 对象提供给一个脚本,该脚本通常会在网页的文档对象模型 (DOM) 上运行。 在大多数情况下,此功能按预期运行。 但是,我在处理 DOM 元素的属性/属性时遇到了问题。

一个特定的属性链是somediv.firstChild.href 我想不通的是如何动态获取firstChild属性值。 目前我能想到的最简单的方法是使用source.replaceAll("firstChild", "firstChild()"); 强制firstChild属性调用函数firstChild()代替。 然而,这最终会打开一个新的蠕虫罐头。

问题

如何定义可以传递给可以通过 DOM 操作的 javascript 函数的对象?

背景

从 C# 中学习

在深入研究 Java 之前,我学习了 C#。 在 C# 中,setter 和 getter 的概念非常普遍。 如果这个接口方法在 Java 中可用,我的问题就会解决。

public string firstChild {
    get { return this.getFirstChild(); }
    set { this.setFirstChild(value); }
}

当前实施

剧本是由目前在功能,我可以在通过包装它调用windowdocument Java对象到函数的工作空间。

documentSpoofedDomElement的特殊顶级版本(扩展它),但在功能上与下面显示的示例相同。 window是另一个具有处理事件侦听器的最少函数的对象。

用于操作 DOM 的 Javascript(代码段)

var somediv = document.createElement('div');
somediv.style.display = "block"
somediv.innerHTML="<a href='/mywork/server/test.html'>The Test Server Homepage</a>";
var linkvalue = somediv.firstChild.href;

此代码段存储为字符串theOriginalSource并在下一节中使用。

用于评估 Javascript 的 Java 代码

String wrappedSource = "var scriptToInvoke = function(window, document){"
    + "\n" + theOriginalSource // from above
    + "\n};"

Object result = invocable.invokeFunction("scriptToInvoke", window, document);

此代码段包装了 javascript 代码段,以便我可以传入对象以用作windowdocument

欺骗 DOM 元素的 Java 类

public class SpoofedDomElement {
    public SpoofedDomElement firstChild;
    public String id;
    public String innerHtml;
    public String href;
    public SpoofedStyleProperties style = new SpoofedStyleProperties();
    public String tagname;
    ...
}

public class SpoofedStyleProperties {
    public String background = "transparent none repeat scroll 0% 0% auto padding-box border-box";
    public String color = null;
    public String display = "inline";
}

上面的类可以很好地处理代码中不相关的部分(例如赋值somediv.style.display = "block" )。 但是当处理firstChildinnerHtml的值时,当任何一个值发生变化时,它就会开始崩溃。

过去的工作

注意,我在我所有的问题中都包含了这一部分,以记录我为未来通过 Google 到达这里的 SO 用户所做的尝试。 这可能会通过帮助头脑风暴来帮助某人找到解决方案。

尝试的解决方案

我曾尝试使用框架 ( HtmlUnit ) 来评估 Javascript。 但我无法控制执行了哪些 Javascript 片段。

潜在的解决方案

以下是我目前正在研究以找到解决方案的问题。 如果我发现了什么,我会回来报告的。

  • 有没有办法在 Java 中模拟 C# getter/setter 行为?
  • Javascript 可以将firstChild评估为函数吗?
  • 有没有办法在 Javascript 中创建一个带有 getter/setter 的包装器,它可以调用我的 Java 类的函数?
  • 是否有一个用于 Nashorn(或类似)的 Apache Commons 库不像完整的模拟框架(例如Selenium )那么重?

看来您正在尝试从 Java 代码实现对脚本对象的友好访问,并试图在 java 库/库之上提供脚本友好的 API。

第一部分 [从 Java 访问脚本对象]

除了 javax.script.Invocable 接口,您还可以使用 JSObject。 Nashorn 将脚本对象公开为 jdk.nashorn.api.scripting.JSObject/.ScriptObjectMirror 的实例

https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/ScriptObjectMirror.html

对于第二部分 [从脚本更友好地访问 Java 对象]

您可以使用“JSAdapter”在脚本本身中编写脚本友好的包装器。

文档和示例:

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-JSAdapterconstructor

如果你更喜欢用 Java 做,你可以实现你自己的 jdk.nashorn.api.scripting.JSObject/.AbstractJSObject。

文档和示例:

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-jsobject

其他 nashorn 特定的脚本扩展也可用于在每个对象的基础上捕获未知的属性/方法访问:

任何脚本对象中的noSuchProperty挂钩:

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions- noSuchProperty

任何脚本对象中的noSuchMethod钩子:

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions- noSuchMethod

Object.bindProperties:

脚本 API 扩展可用于将一个对象的属性绑定到另一个对象 - 源对象也可以是 Java 对象。

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-Object.bindProperties

使用 jdk9,Dynalink API [ http://openjdk.java.net/jeps/276 ] 可以实现更灵活的语言间链接

也可以看看:

https://blogs.oracle.com/sundararajan/entry/dynamic_linker_api_for_the

https://blogs.oracle.com/sundararajan/entry/writing_pluggable_dynalink_linker_and

https://blogs.oracle.com/sundararajan/entry/nashorn_javascript_access_to_python

Nashorn OpenJDK 存储库的 dynalink 示例“samples/dynalink”目录中有:

http://hg.openjdk.java.net/jdk9/dev/nashorn/file/4a6ee1185fc8/samples/dynalink

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM