mozilla

Cómo incrustar el motor Javascript

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

 

Etiquetas y colaboradores del documento

Etiquetas: 
Contributors to this page: teoli, Pgulijczuk, edwinduque@gmail.com
Última actualización por: teoli,