我在一个对象中有一些属性,我想添加到全局命名空间.在浏览器的javascript中,我可以将其添加到window
对象中,如下所示:
var myObject = {
foo : function() {
alert("hi");
}
// and many more properties
};
for (property in myObject) {
window[property] = myObject[property];
}
// now I can just call foo()
foo();
Run Code Online (Sandbox Code Playgroud)
但由于rhino没有全局窗口对象,我无法做到这一点.有没有一个等效的对象或其他方式来实现这一目标?
使用Java可以很容易地将对象提供给Rhino ScriptableObject.putProperty
,但是有没有办法公开顶级函数?也就是说,我可以这样做,以便Rhino中的脚本可以调用foo()
并调用Java代码吗?
我正在寻找一种方法将Javascript Date对象转换为字符串.我正在将我的网站从Ruby转换为服务器端Javascript,我正在寻找类似于strftime
Ruby,C和许多其他语言的东西.
我发现有很多简单的脚本可以进行这种转换,但是如果有一种标准的方法,我宁愿不包含自定义实现.
我没有使用Javascript框架.我正在使用Mozilla Rhino,但我希望尽可能远离使用Java库,以便在实现之间轻松移动我的代码.
我希望能够指定字符串的格式,因为我想将它嵌入句子中.我希望能够在's和's上插入任意内容,并且拥有当天的全名,而不仅仅是它的缩写.所以toString()是不够的.
我开始遇到一个非常有用的JSR223脚本环境的肮脏的小秘密.
我正在使用Java 6 SE附带的内置版Rhino,通过JSR223 ScriptingEngine
等访问它.
当我得到一个由我导出到Javascript环境的Java对象引起的异常时,它会ScriptingException
包装一个sun.org.mozilla.javascript.internal.WrappedException
包装我的真正异常(例如UnsupportedOperationException
或者其他)
ScriptingException
getFileName()的返回值为null,getLineNumber()的返回值为-1.但是当我查看消息和调试器时,它WrappedException
具有正确的文件名和行号,它只是不通过ScriptingException的getter方法发布它.
大.现在我该怎么办?我不知道我将如何使用sun.org.mozilla.javascript.internal.wrappedException,它不是公共类.
是否有任何提示和技巧使犀牛表现更快?我正在尝试使用Rhino中的uglifyJs压缩大型js文件,这需要一分多钟.在java服务器端空间中你有任何关于rhino的提示或其他选择吗?
有没有更简洁的方法来获取Javascript对象的JSON表示而不是以下kludge?
System.out.println(((ScriptableObject) scope).callMethod(
cx, (Scriptable) scope.get("JSON", scope),
"stringify", new Object[]{jsObject}));
Run Code Online (Sandbox Code Playgroud)
其中jsObject是我想要字符串化的ScriptableObject.
我需要帮助让CommonJS使用Java 7和Rhino 1.7R3.
Rhino 1.7R3支持CommonJS模块:
Java 7与Rhino 1.7R3捆绑在一起.不幸的是,Java 7的Rhino是一个修改版本,它不包括这个org.mozilla.javascript.commonjs
包:
我想通过javax.script
API 使用Rhino 1.7R3对CommonJS的支持,如下所示:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
engine.put("markdown", markdown);
engine.eval("var html = require('./Markdown.Sanitizer').getSanitizingConverter().makeHtml(markdown);");
return (String) engine.get("html");
Run Code Online (Sandbox Code Playgroud)
(我通过验证ScriptEngineManager
确实使用了Rhino 1.7R3引擎.)我想也许我可以将以下依赖项添加到类路径中
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
<version>1.7R3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
而CommonJS-特别是,require()
- 将开始工作.但事实并非如此.当我尝试使用时,require()
我得到了
Caused by: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "require" is not defined. (<Unknown source>#2)
at sun.org.mozilla.javascript.internal.ScriptRuntime.constructError(ScriptRuntime.java:3773)
at sun.org.mozilla.javascript.internal.ScriptRuntime.constructError(ScriptRuntime.java:3751)
at sun.org.mozilla.javascript.internal.ScriptRuntime.notFoundError(ScriptRuntime.java:3836)
Run Code Online (Sandbox Code Playgroud)
如何让Java 7与完整版Rhino 1.7R3一起使用,以便获得CommonJS支持?
编辑:我发现了以下问题,它涉及完全相同的主题:
受访者表示也许可以用CommonJS Rhino 1.7R3替换有限的Rhino 1.7R3,但没有说明如何做到这一点.这就是我在这里问的问题.
我在android中使用Rhino在Android(java)中执行JavaScript函数代码并从此代码中获取结果,但是我得到了这个异常
01-22 11:33:57.063:E/AndroidRuntime(29175):引起:java.lang.UnsupportedOperationException:无法加载此类类文件
这是我的代码
String test = "function abc(x,y) {return x+y;}";
org.mozilla.javascript.Context context = org.mozilla.javascript.Context.enter();
try {
ScriptableObject scope = context.initStandardObjects();
Scriptable that = context.newObject(scope);
Function fct = context.compileFunction(scope, test, "script", 1, null);
Object result = fct.call(context, scope, that, new Object[] { 2, 3 });
Log.i("JML...Info", "jajajajaj = " + org.mozilla.javascript.Context.jsToJava(result, int.class));
} finally {
org.mozilla.javascript.Context.exit();
}
Run Code Online (Sandbox Code Playgroud)
我得到了方法的例外
函数fct = context.compileFunction(scope,test,"script",1,null);
我在加载webview后在方法onCreate()中编写了这段代码,并使用rhino1_7R2.jar作为Rhino的jar.
请帮助我,如果你知道任何其他方式从Android获取一个值(函数的返回值)请建议.
谢谢
我正在尝试将此答案适用于regexp替换的情况:
<scriptdef name="propertyregex" language="javascript">
<attribute name="property"/>
<attribute name="input"/>
<attribute name="regexp"/>
<attribute name="replace"/>
<![CDATA[
var input = attributes.get("input");
var regex = new RegExp(attributes.get("regexp"));
var replace = attributes.get("replace");
var res = input.replace(regex, replace);
project.setProperty(attributes.get("property"), res);
]]>
</scriptdef>
Run Code Online (Sandbox Code Playgroud)
但是,执行该代码我总是得到一个例外:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException:
The choice of Java constructor replace matching JavaScript argument types
(function,java.lang.String) is ambiguous; candidate constructors are:
class java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence)
class java.lang.String replace(char,char)
Run Code Online (Sandbox Code Playgroud)
我怎样才能在这里做正则表达式替换?
我有一个Java 7程序,它加载了数千个对象(组件),每个对象都有许多参数(存储在a中Map
),并在这些对象上执行各种Rhino脚本来计算其他派生参数,这些参数存储在对象中Map
.在运行每个脚本之前,Scope
会创建一个对象的映射支持的对象,该对象在脚本的持续时间内用作JavaScript的作用域.
举一个简单的例子,下面创建一个HashMap
a = 10和b = 20,并执行脚本c = a + b
,这会导致c = 30.0
存储在地图中.虽然脚本看起来像是在创建一个全局变量c
,但该Scope
对象会捕获它并将其存储在地图中; 使用不同Scope
对象执行的另一个脚本将不会看到此变量:
public class Rhino {
public static void main(String[] args) throws ScriptException {
Context cx = Context.enter();
Scriptable root_scope = cx.initStandardObjects();
Map<String, Object> map = new HashMap<>();
map.put("a", 10);
map.put("b", 20);
Scope scope = new Scope(root_scope, map);
cx.evaluateString(scope, "c = a + b", "<expr>", 0, null);
System.out.println(map); // --> …
Run Code Online (Sandbox Code Playgroud)