Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

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: 
 Colaboradores en esta página: teoli, [email protected], Pgulijczuk
 Última actualización por: teoli,