首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从java端访问javascript方法

从java端访问javascript方法
EN

Stack Overflow用户
提问于 2013-09-04 21:31:36
回答 2查看 101关注 0票数 0

我有一个javascript资源,并应用Rhino脚本引擎从java端调用方法。

代码语言:javascript
复制
 (function( global ){

    var Result;

    (Result = function( val ) {
        this.tpl = val || '' ;
    }).prototype = {

        get: function ()
        {
            return this.tpl ;
        }

    };
} ( window ) ) ;

这就是我在java端的方法,我如何在上面的脚本中调用get方法呢?

代码语言:javascript
复制
    @Test
    public void testCallJSMethod() throws Exception {
        String jsResource = getJSResource();

        jsEngine.put("window", "window");
        jsEngine.put("window.Result", "Result");

        jsEngine.eval(jsResource);

        Invocable inv = (Invocable) jsEngine;

        Object obj = jsEngine.get("window.Result");
        assertEquals(true, obj != null);

        //try to call get method in above script, but it doesn't work
        inv.invokeMethod(obj, "get", new Object[] {} );
    }
EN

Stack Overflow用户

发布于 2014-03-31 17:02:15

我发现你的代码有几个问题:

代码语言:javascript
复制
    jsEngine.put("window", "window");

这不会将window定义为JavaScript对象。您可以按如下方式执行此操作:

代码语言:javascript
复制
    jsEngine.eval("window={}");

在您的javascript中,Result是一个局部变量,在调用外部函数时它将无法存活。相反,您应该将您的函数分配给global.Result:

代码语言:javascript
复制
(function(global) {
    (global.Result = function(val) {
        this.tpl = val || '';
    }).prototype = {
        get: function()
        {
            return this.tpl;
        }

    };
})(window);

JsEngine.get(名称)获取变量的值。如果需要window.Result的值,则必须执行jsEngine.eval("window.Result"),而不是jsEngine.get("window.Result")。

但window.Result实际上是一个函数。实际上是一个构造函数。因此,要创建一个实例,您必须执行如下操作: jsEngine.eval("new window.Result('Hello world!‘)“)。

因此,您的java函数将变为:

代码语言:javascript
复制
@Test
public void testCallJSMethod() throws Exception {
    String jsResource = getJSResource();

    jsEngine.eval("window={}");

    jsEngine.eval(jsResource);

    Invocable inv = (Invocable) jsEngine;

    Object obj = jsEngine.eval("new window.Result('Hello World!!!')");
    assertEquals(true, obj != null);

    Object res = inv.invokeMethod(obj, "get", new Object[] {} );
    assertEquals(res, "Hello World!!!");
}
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18615281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档