Java怎么不能调用JavaScript的某些函数呢?

[quote]
我在Java中调用JavaScript代码时,老报异常。比如我在JavaScript代码中写了alert()函数时,就会报异常。我感觉Java只能条用JavaScript中的又返回值的函数,而且不能有document.write()等代码。
不知道我们的浏览器是怎么实现对JavaScript调用的。能不能有什么方法得到JavaScript执行后的值。因为在很多网页都是使用了JavaScript的来动态显示信息。

[/quote]
[code="java"]

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test2 {

public static void main(String[] args) throws Exception{
    test();
}

public static void test() throws Exception{
    ScriptEngineManager sem=new ScriptEngineManager();
    ScriptEngine se=sem.getEngineByExtension("js");
    se.eval("<script language='javascript'> document.write('aaaa')</script>");

}

}

异常提示:

Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: syntax error (#1) in at line number 1
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:110)
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:124)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)
at test.script.Test2.test(Test2.java:15)
at test.script.Test2.main(Test2.java:9)

[/code]

6个回答

来自java.sun.com
import netscape.javascript.*;
import java.applet.*;
import java.awt.*;
class MyApplet extends Applet {
public void init() {
JSObject win = JSObject.getWindow(this);
JSObject doc = (JSObject) win.getMember("document");
JSObject loc = (JSObject) doc.getMember("location");

     String s = (String) loc.getMember("href");  // document.location.href
     win.call("f", null);                 

HTML page
}
}

JSObject的主要方法
public Object call(String methodName, Object args[])
public Object eval(String s)
public Object getMember(String name)
public Object getSlot(int index)
public void removeMember(String name)
public void setMember(String name, Object value)
public void setSlot(int index, Object value)
public String toString()

呵呵,原来是大名鼎鼎的rhino

没有仔细研究过,但是根据报的异常来看,说的是js源代码错误,或者你应该找找rhino的范例看看如何写js执行.

[code="java"]public void testEvalWithBindings()
throws ScriptException {
 ScriptEngineManager manager = new ScriptEngineManager();
 ScriptEngine engine = manager.getEngineByName("js");
 Bindings bindings = engine.createBindings();
 bindings.put("age", 26);
 bindings.put("noClaims", Boolean.TRUE);
 bindings.put("riskFactor", 1);

 engine.eval(
  "if (age < 25){ " +
   " riskFactor = 1.5;" +
  "} else if (noClaims) {" +
   " riskFactor = 0.75;" +
  "} else {" +
   " riskFactor = 1.0;" +
  "}");

 double risk = bindings.get("riskFactor");
 assertEquals(risk,0.75);
}[/code]

建议你去掉开头跟结尾的那些试试,应该是不需要这样的头尾的.</p>

这样写不好吧,最好是放着HTML里面写,这样比较规范,而且有利于可以相互取值,公用方法,或者是使用AJAX也可以,这样比较方便

楼主确定清楚自己要用Rhino来做什么么?
标签是HTML标签,用来表示一块东西里面是脚本;Rhino是单纯用来执行JavaScript的解释器,看到HTML自然会抱怨说“unknown syntax”,也就是语法错误。<br> alert是浏览器中的JavaScript脚本可以使用的一个内置函数,但并不是JavaScript语言自身的内置函数。在Rhino中可以使用print()函数来输出内容。</p> <p>如果楼主是想实验JavaScript语言本身,或者想用JavaScript来为Java程序提供脚本功能,那么可以使用Rhino。如果是想实验浏览器中的JavaScript行为,那Rhino就不合适了。</p>

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐