【问题标题】:Call external JavaScript located inside iframe from java code using jsni使用 jsni 从 java 代码调用位于 iframe 内的外部 JavaScript
【发布时间】:2016-10-16 19:08:17
【问题描述】:

我正在尝试使用以下代码从 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,但在我的情况下我不能这样做。还有其他解决办法吗?

【问题讨论】:

  • 发布一个示例代码,我可以执行并重现问题,在这 3 行代码部分中找不到问题。见 - sscce.org

标签: javascript java iframe gwt jsni


【解决方案1】:

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

【讨论】:

  • 您现在应该接受您的答案(如果在标题中添加“已解决”)
【解决方案2】:

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

$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);
    }
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2011-07-05
    • 2010-12-12
    • 2011-10-19
    相关资源
    最近更新 更多