使用jsni从java代码调用位于iframe内部的外部JavaScript

时间:2016-10-16 19:08:18

标签: javascript java iframe gwt jsni

我正在尝试使用以下代码从Java调用JavaScript方法

native void notifyJs() /*-{
    $wnd.foo();
}-*/;

JavaScript方法位于iframe内部,看起来像

function foo() {
    alert("Do something");
}

但我收到此错误

SEVERE: (TypeError) : $wnd.foo is not a functioncom.google.gwt.core.client.JavaScriptException: (TypeError) : $wnd.foo is not a function

我已经读过我应该在.nocache.js之前添加myScript,但在我的情况下我不能这样做。还有其他解决方案吗?

2 个答案:

答案 0 :(得分:0)

错误消息准确地说明了您的问题:
foo范围内没有函数$wnd

$wnd是指您的GWT代码正在运行的iframe的父级,因此如果您将foo方法放在iframe中,则无法找到它。
尝试将foo方法放在* .html文件中,其中调用.nocache.js

参考您的问题,您在.nocache.js后添加了javascript:
我也有同样的问题,我用一个计时器修复它,等待Js加载。

private native boolean isLoaded()/*-{
    if (typeof $wnd.foo != 'undefined') {
        return true;
    }
    return false;
}-*/;

private void tryNotifyJs() {
    if (isLoaded()) {
        notifyJs();
    } else {
        Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {

            @Override
            public boolean execute() {
                tryNotifyJs();
                return false;
            }
        }, 100);
    }
}  

答案 1 :(得分:0)

我通过用$ wnd.frames [0]替换$ wnd解决了这个问题。 由于foo函数位于此框架内。