mozilla
Los resultados de tu búsqueda

    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: Pgulijczuk, edwinduque@gmail.com, teoli
    Última actualización por: teoli,