Ver tambien JSAPI User Guide. En particular, tiene mas y mejores ejemplos de codigo.
Un esqueleto de Tutorial
Comprobación para iniciar una maquina virtual y ejecutar un script sin ningún error:
- null retorna de JS_ funciones que retornan punteros.
- false retorna de JS_ funciones que retornan booleanos.
(los errores son convencionalmente guardados en una variable JSBool llamada ok).
JSRuntime *rt; JSContext *cx; JSObject *global; JSClass global_class = { "global",0, JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub, JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub }; /* * Siempre necesitará: * un runtime por proceso, * un contexto por hilo, * un objeto global por contexto, * clases estandard (ej. fecha). */ rt = JS_NewRuntime(0x100000); cx = JS_NewContext(rt, 0x1000); global = JS_NewObject(cx, &global_class, NULL, NULL); JS_InitStandardClasses(cx, global); /* * Ahora suponga que el script contiene algún JS para evaluar, por decir "22/7" como una * mala aproximación para la función matematica Math.PI, o algo mas largo, como esto: * "(function fact(n){if (n <= 1) return 1; return n * fact(n-1)})(5)" * para calcular 5! */ char *script = "..."; jsval rval; JSString *str; JSBool ok; ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno, &rval); str = JS_ValueToString(cx, rval); printf("script result: %s\n", JS_GetStringBytes(str));
Como llamar funciones de C desde JavaScript
Suponga que la función en C sea llamada doit
y le gustaria que al menos 2 parametros sean llamados (si el llamado suministra menos, el motor JS deberia asegurar que lo indefinido sea pasado por lo faltante):
#define DOIT_MINARGS 2 static JSBool doit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { /* * Look in argv for argc actual parameters, set *rval to return a * value to the caller. */ ... }
Entonces para la conexión con JS, debe escribir:
ok = JS_DefineFunction(cx, global, "doit", doit, DOIT_MINARGS, 0);
O, si tenia una serie de funciones nativas para definir, las pondria probablemente en una tabla:
static JSFunctionSpec my_functions[] = { {"doit", doit, DOIT_MINARGS, 0, 0}, etc... {0,0,0,0,0}, };
(Al final, todos los ceros especificados en la función terminan la tabla), y decir:
ok = JS_DefineFunctions(cx, global, my_functions);
Como llamar funciones de JavaScript desde C
Say the click event is for the top-most or focused UI element at position (x, y):
JSObject *target, *event; jsval argv[1], rval; /* * Find event target and make event object to represent this click. * Pass cx to NewEventObject so JS_NewObject can be called. */ target = FindEventTargetAt(cx, global, x, y); event = NewEventObject(cx, "click", x, y); argv[0] = OBJECT_TO_JSVAL(event); /* To emulate the DOM, you might want to try "onclick" too. */ ok = JS_CallFunctionName(cx, target, "onClick", 1, argv, &rval); /* Now test rval to see whether we should cancel the event. */ if (JSVAL_IS_BOOLEAN(rval) && !JSVAL_TO_BOOLEAN(rval)) CancelEvent(event);
Again, I've elided error checking (such as testing for !ok
after the call), and I've faked up some C event management routines that emulate the DOM's convention of canceling an event if its handler returns false.
Original Document Information
- Author: Brendan Eich
- Last Updated Date: 21 February, 2000