【问题标题】:How to wait for a Java applet to finish loading on Safari?如何等待 Java 小程序在 Safari 上完成加载?
【发布时间】:2009-08-18 11:45:55
【问题描述】:

这在 Safari 中不起作用:

<html>
<body>
<applet id="MyApplet" code="MyAppletClass" archive="MyApplet.jar">
<script type="text/javascript">
   alert(document.getElementById('MyApplet').myMethod);
</script>
</body>
</html>

myMethodMyAppletClass 中声明的公共方法。

当我第一次在 Safari 中加载页面时,它会在小程序完成加载之前显示警报(因此消息框显示undefined)。如果我刷新页面,小程序已经加载,并且警报显示function myMethod() { [native code] },正如您所期望的那样。

当然,这意味着小程序方法在加载之前不可用,但 Safari 不会阻止 JavaScript 运行。 &lt;body onLoad&gt; 也会出现同样的问题。

我需要的是 &lt;body onAppletLoad="doSomething()"&gt; 之类的东西。我该如何解决这个问题?

PS:我不确定它是否相关,但 JAR 已签名。

【问题讨论】:

    标签: javascript java safari dom-events


    【解决方案1】:

    我使用了一个计时器,它会在放弃之前重置并持续检查多次。

    <script language="text/javascript" defer>
    
    function performAppletCode(count) {
        var applet = document.getElementById('MyApplet');
    
        if (!applet.myMethod && count > 0) {
           setTimeout( function() { performAppletCode( --count ); }, 2000 );
        }
        else if (applet.myMethod) {
           // use the applet for something
        }
        else {
           alert( 'applet failed to load' );
        }
    }  
    
    performAppletCode( 10 );
    
    </script>               
    

    请注意,这假定小程序将在 Safari 中运行。我遇到过一些小程序需要 Java 6 的情况,即使使用与上述类似的代码,它也会简单地挂起 Safari。我选择在服务器上进行浏览器检测,并在浏览器不支持小程序时将用户重定向到错误页面。

    【讨论】:

    • 谢谢。可惜没有更清洁的方法!
    • 您也可以简单地检查小程序。至少,你可以在 Firefox 中。我还没有签入 Chrome 和 IE。这样,您不必修改小程序以具有特定方法。
    【解决方案2】:

    这是我为此编写的一个通用函数:

    /* Attempt to load the applet up to "X" times with a delay. If it succeeds, then execute the callback function. */
    function WaitForAppletLoad(applet_id, attempts, delay, onSuccessCallback, onFailCallback) {
        //Test
        var to = typeof (document.getElementById(applet_id));
        if (to == "function") {
            onSuccessCallback(); //Go do it.
            return true;
        } else {
            if (attempts == 0) {
                onFailCallback();
                return false;
            } else {
                //Put it back in the hopper.
                setTimeout(function () {
                    WaitForAppletLoad(applet_id, --attempts, delay, onSuccessCallback, onFailCallback);
                }, delay);
            }
        }
    }
    

    这样称呼它:

    WaitForAppletLoad("fileapplet", 10, 2000, function () {
        document.getElementById("fileapplet").getDirectoriesObject("c:/");
    }, function () {
        alert("Sorry, unable to load the local file browser.");
    });
    

    【讨论】:

    • 您也可以尝试 document.getElementById(applet_id).isActive 来测试上面示例中是否加载了小程序,它对我有用。 :)
    • 但是如果你这样做,document.getElementById(applet_id)会在它不存在的时候返回null,然后它会抛出一个“.isActive”的空引用异常。我不想通过异常进行测试,这在 JS 中非常非常慢。
    • 就我的测试而言,typeof (document.getElementById(applet_id)) 总是返回object。你是说typeof (document.getElementById(applet_id).someFunction) 吗?
    • 我认为这取决于您的小程序是什么以及它是如何配置的。您可能必须同时测试元素和函数。您不能只通过它自己测试 typeof (document.getElementById(applet_id).someFunction),因为 document.getElementById(applet_id) 可能会在生命周期的早期返回 null,在尝试访问 .someFunction 时抛出无效的对象异常。
    【解决方案3】:

    前段时间我遇到了类似的问题,将 MAYSCRIPT 添加到小程序标签解决了我的问题。

    看看这个页面: http://www.htmlcodetutorial.com/applets/_APPLET_MAYSCRIPT.html

    希望对你有帮助!

    【讨论】:

    • 我不明白这与等待小程序加载有什么关系。此外,页面上的示例在 Snow Leopard 上的 Firefox 3.5.4 中也不起作用。
    • 仅适用于 IE 的 AFAIU。换句话说,不是 OS X 也不是 Safari。
    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多