gpt4 book ai didi

javascript - 将 Javascript 属性连接到 Java 对象

转载 作者:行者123 更新时间:2023-11-30 07:08:04 24 4
gpt4 key购买 nike

问题

我正在尝试将 Java 对象输入到通常在网页的文档对象模型 (DOM) 上运行的脚本中。在大多数情况下,这会按预期运行。然而,我在处理 DOM 元素的属性时遇到了问题。

感兴趣的特定属性链是somediv.firstChild.href。我不知道如何动态获取 firstChild 属性值。我目前能想到的最简单的方法是使用 source.replaceAll("firstChild", "firstChild()"); 强制 firstChild 属性调用函数 firstChild() 来代替。然而,这最终会带来新的蠕虫。

问题

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

背景

从 C# 中学到的东西

在深入研究 Java 之前,我学习了 C#。在 C# 中,setter 和 getter 的概念非常普遍。如果这个接口(interface)方法在 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 到达此处的 future SO 用户所做的尝试。这可能会帮助某人通过头脑 Storm 来找到解决方案。

尝试的解决方案

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

潜在的解决方案

以下是我目前正在研究寻找解决方案的问题。如果我发现任何东西,我会报告。

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

最佳答案

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

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

除了 javax.script.Invocable 接口(interface)之外,您还可以使用 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 任何脚本对象中的钩子(Hook):

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

noSuchMethod Hook 任何脚本对象:

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

对象.bindProperties:

脚本 API 扩展可用于将一个对象的属性绑定(bind)到另一个对象 - 源对象也可以是 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 存储库的“samples/dynalink”目录中有 dynalink 示例:

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

关于javascript - 将 Javascript 属性连接到 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39731248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com