文档

Java™ 教程
隐藏目录
Invoking JavaScript Code From an Applet(从Applet调用JavaScript代码)
路径:部署
课程:Java Applets
章节:更多Java Applets

从Applet中调用JavaScript代码

Java applets可以调用与applet相同网页中的JavaScript函数。 LiveConnect规范描述了JavaScript代码如何与Java代码进行通信的详细信息。

netscape.javascript.JSObject类使Java applets能够获取对JavaScript对象的引用并与网页进行交互。下面描述的Data Summary applet调用JavaScript代码从网页中检索信息,并将数据摘要写回到网页。

假设您有一个带有几个JavaScript函数的网页。例子AppletPage.html有用于检索年龄、地址和电话号码的JavaScript函数。还有一个名为userName的变量,在一开始时没有值。

<head>
<title>Data Summary Applet Page - Java to JavaScript LiveConnect</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/>
<script language="javascript">
    var userName = "";
    
    // 返回数字
    function getAge() { 
        return 25;
    }
    // 返回对象
    function address() { 
        this.street = "1 Example Lane";
        this.city = "Santa Clara";
        this.state = "CA";
    }
    // 返回数组
    function getPhoneNums() { 
        return ["408-555-0100", "408-555-0102"];
    } 
    function writeSummary(summary) {
        summaryElem =
            document.getElementById("summary");
        summaryElem.innerHTML = summary;
    }
    </script>

    <!-- ... -->      
</head>
<body>
    <script src =
      "https://www.java.com/js/deployJava.js"></script>
    <script> 
        <!-- ... -->
        deployJava.runApplet(attributes, parameters, '1.6'); 
    </script>          
    <!-- ... -->
    <p id="summary"/>  // 这个HTML元素包含
                             // 数据摘要 
    <!-- ... -->
</body>

接下来,考虑一个名为DataSummaryApplet的applet类。 DataSummaryApplet类执行以下操作:

此applet首先需要检索对JSObject的引用,如下所示:

...
JSObject window = JSObject.getWindow(this);
...

将上述语句放入try...catch...块中来处理netscape.javascript.JSException异常。

现在,applet已经有了对JSObject的引用,可以使用JSObjectevalcall方法来调用相关的JavaScript函数。

package javatojs;

import java.applet.Applet;
import netscape.javascript.*; // 在编译时将plugin.jar添加到类路径中

public class DataSummaryApplet extends Applet {
    public void start() {
        try {
            JSObject window = JSObject.getWindow(this);

            String userName = "John Doe";

            // 设置JavaScript变量
            window.setMember("userName", userName);

            // 调用JavaScript函数
            Number age = (Number) window.eval("getAge()");

            // 获取JavaScript对象并检索其内容
            JSObject address = (JSObject) window.eval("new address();");
            String addressStr = (String) address.getMember("street") + ", " +
                    (String) address.getMember("city") + ", " +
                    (String) address.getMember("state");

            // 从JavaScript获取数组并检索其内容
            JSObject phoneNums = (JSObject) window.eval("getPhoneNums()");
            String phoneNumStr = (String) phoneNums.getSlot(0) + ", " +
                    (String) phoneNums.getSlot(1);

            // 动态更改页面中的HTML;写入数据摘要
            String summary = userName + " : " + age + " : " +
                    addressStr + " : " + phoneNumStr;
            window.call("writeSummary", new Object[] {summary})   ;
        } catch (JSException jse) {
            jse.printStackTrace();
        }
    }
}

要编译引用了netscape.javascript包中类的Java代码,请在类路径中包含<您的JDK路径>/jre/lib/plugin.jar。在运行时,Java插件软件会自动将这些类提供给applet使用。

Data Summary applet在网页上显示以下结果:

applet对此页面上的JavaScript的Java调用的结果
                
John Doe : 25 : 1 Example Lane, Santa Clara, CA : 408-555-0100, 408-555-0102

在浏览器中打开AppletPage.html以查看Data Summary applet。


注意:如果您看不到applet运行,请安装至少Java SE Development Kit (JDK) 6 update 10版本。

注意: 如果您看不到示例运行,可能需要在浏览器中启用JavaScript解释器,以使Deployment Toolkit脚本能够正常运行。

下载从小程序调用JavaScript代码示例的源代码以进行进一步实验。


上一页:在浏览器中显示文档
下一页:从JavaScript代码调用Applet方法