5

小程序是我自己的,调用 ready() 只返回“是”。

首先,我尝试像这样嵌入小程序:

        <object id="appletIe"
        classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
        width="100%" height="100%"
        codebase="MyApplet.jar">
        <param name="archive" value="MyApplet.jar" />
        <param name="code" value="MyPackage.Myclass" />
        <param name="myParam" value="My Param Value" />
         <embed id="applet" MAYSCRIPT=true
        type="application/x-java-applet;version=1.6"
        width="1px" height="1px"
        archive="MyApplet.jar"
        code="MyPackage.Myclass"
        pluginspage="http://java.com/download/">
        </object>

我试图通过像这样在 document.ready 上调用 ready() 来检查它是否加载了 javascript:但我立即收到错误(TypeError: $(...).get(...).ready is not a function)所以我假设它在加载之前尝试调用applet ready() 函数。

$(function(){
  if (CheckApplet() == false) {
          $('#appletStatus').html('Failed to load applet.');
      } 
  });



  function CheckApplet() {
      return $('#applet').get(0).ready() == 'yes';
  }

然后我尝试用 jquery 加载小程序,如下所示:

这工作得更好一些,它在加载小程序之前不会调用小程序的 ready() 函数。但是偶尔它不起作用,javascript变得无响应,即使小程序似乎加载正常也不会产生错误。

 $(function(){
  var html = '';

    if ($.browser.msie) {
        html += '<object id="applet" ';
        html += 'classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" ';
        html += 'width="100%" height="100%" ';
        html += 'codebase="MyApplet.jar"> ';
        html += '<param name="archive" value="MyApplet.jar" /> ';
        html += '<param name="code" value="MyPackage.Myclass" /> ';
        html += '<param name="myParam" value="My Param Value" /> ';
        html += '< /object>';
    } else {
        html += '<embed id="applet"';
        html += 'type="application/x-java-applet;version=1.6"';
        html += 'width="1px" height="1px" ';
        html += 'archive="MyApplet.jar"';
        html += 'code="MyPackage.Myclass" ';
        html += 'pluginspage="http://java.com/download/"';
        html += 'myParam="My Param Value" />';
        html += '</embed>';
    }
    $('#myDiv').append(html);

if (CheckApplet() == false) {
          $('#appletStatus').html('Failed to load applet.');
      } 

});

我正在寻找有关如何改进这一点或其他实现解决方案的方法的建议。

4

3 回答 3

7

我喜欢 dronus 的回答,但没有发现 Oracle 的链接很有帮助,所以这是我的完整代码,我花了一段时间才整理出来(是的,我知道,我有点慢)。

在 applet 类的 init() 方法的末尾(示例中为“myApplet”):

JSObject window = JSObject.getWindow(this);
Runnable r = new RunJScript(window);
new Thread(r).start();

在与您的小程序类相同的包中的一个新的单独类中:

import netscape.javascript.JSObject;

public class RunJScript implements Runnable
{
    private JSObject window;
    public RunJScript(JSObject window) 
    {
        this.window = window;
    }

   public void run() 
   {
        window.call("waitUntilAppletLoaded", null);
   }

}

在包含您的小程序的网页标题中:

<SCRIPT language="javascript">
    timeOut = 0;
    function waitUntilAppletLoaded() 
    {
        if (document.applets['myApplet'].isActive()) 
        {
            // Your actions now that the applet has finished loading.
        }
        else 
        {
            // Increase the timeout by half a second each time round.
            timeOut = timeOut + 500
            settimeout(waitUntilAppletLoaded(),timeOut)
        }
    }
</SCRIPT>
于 2014-02-26T01:02:50.217 回答
7

正如您新知道的那样,当您的小程序启动时(必须运行 JVM,下载并运行 .jar 并且 .ready() 必须连接到浏览器),让小程序告诉浏览器何时它会是一个更好的策略准备好了。例如,它可以通过调用一个名为 applet_ready() 的 JS 函数来做到这一点。

在这里查看小程序如何调用 JavaScript 函数: http ://docs.oracle.com/javase/tutorial/deployment/applet/invokingJavaScriptFromApplet.html

于 2013-08-28T21:11:45.093 回答
1

如果您无权访问小程序源代码,您可以在调用小程序方法之前轮询要加载的小程序。

看看这个答案:https ://stackoverflow.com/a/7150084/513173

于 2014-08-26T14:09:28.030 回答