我正在使用JSObject从我的Applet调用Javascript函数。
我的小程序的SSCCE:
package ch.vrag.web;
import java.applet.Applet;
import java.security.AllPermission;
import java.security.CodeSource;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Policy;
import netscape.javascript.JSObject;
public class Sscce extends Applet {
private static final long serialVersionUID = -5403444704039831864L;
public void init() {
try {
Policy.setPolicy(new Policy() {
Permissions perms = new Permissions();
public PermissionCollection getPermissions(CodeSource codesource) throws SecurityException {
AllPermission grant = null;
grant = new AllPermission();
perms.add(grant);
return perms;
}
public void refresh() {
// Do nothing
}
});
}
catch (Exception e) {
}
JSObject window = JSObject.getWindow(this);
JSObject phoneNums = (JSObject) window.eval("getWindowRectangle()");
int x;
int y;
int width;
int height;
if (phoneNums.getSlot(0) instanceof Integer) {
x = (Integer) phoneNums.getSlot(0);
y = (Integer) phoneNums.getSlot(1);
width = (Integer) phoneNums.getSlot(2);
height = (Integer) phoneNums.getSlot(3);
}
else if (phoneNums.getSlot(0) instanceof Double) {
x = ((Double) phoneNums.getSlot(0)).intValue();
y = ((Double) phoneNums.getSlot(1)).intValue();
width = ((Double) phoneNums.getSlot(2)).intValue();
height = ((Double) phoneNums.getSlot(3)).intValue();
}
else {
return;
}
System.out.println("x: " + x + " y: " + y + " width: " + width + " height: " + height);
};
}
我的HTML文件的SSCCE:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<script type="text/javascript">
function getWindowRectangle(){
var winX = (document.all)?window.screenLeft-2:window.screenX;
var winY = (document.all)?window.screenTop-2:window.screenY;
var winWidth = (document.all)?document.documentElement.offsetWidth+4:window.outerWidth;
var winHeight = (document.all)?document.documentElement.offsetHeight+4:window.outerHeight;
return([winX,winY,winWidth,winHeight]);
}
</script>
<title>SSCCE</title>
</head>
<body>
this is an SSCCE
<APPLET CODE="ch.vrag.web.Sscce.class" name="SSCCE" codebase="scripts" archive="Sscce.jar" width=0 height=0 MAYSCRIPT >
</APPLET>
</body>
这在Internet Explorer 6中运行得非常好。我有这个Java异常:
java.lang.Exception: netscape.javascript.JSException: Unknown Name
这个例外有什么用?我做错了什么?
答案 0 :(得分:1)
Internet Explorer 6似乎有getSlot()
命令的问题,但我可以使用解决方法。
使用此对象:
JSObject phoneNums = (JSObject) window.eval("getWindowRectangle()");
我可以从phoneNumbs(phoneNums.toString();
)中获取一个String,这个String以这种形式给出了我的返回值:
“数字1,数字,number3的,号码4”
所以我可以分割字符串并获得我需要的数字。
故事的寓意是,Internet Exlorer 6不是现代的,不应再使用了!
答案 1 :(得分:0)
这与浏览器无法正常运行Javascript有关。确保IE6已修补到SV3版本,并且启用了Javascript以及可能的安全设置。
答案 2 :(得分:0)
在Read/Write HTML field values from Java的底部是细则:
为获得最佳效果,请勿在Applet的init()方法中使用LiveConnect JSObject。
原因是此时通常是null
。我在applet JSObject
方法中获得对start()
的引用时取得了更多成功。
JSObject phoneNums = (JSObject) window.eval("getWindowRectangle()");
我怀疑这应该是JSObject.call("getWindowRectangle()")
。对返回的Object
进行一些调试,在调试器中检查它以检查内容是否符合预期。