服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使浏览器实现javascript支持的方法解析

一、 基本的javascript 开发环境

javascript reference与javascript api:

javascript reference是用于建立包含javascript runtime的library或 dll,然后编译成小的 "shell" 程序,连接library后生成交互式的javascript解释器,也可以用来解释.js 文件。

该程序不依赖navigator代码。

生成的"shell" 程序,对比浏览器对javascript的支持,相同之处是使用相同的包含javascript runtime的library 或 dll,我们把这部份相同的library或 dll称为javascript api,我们实际开发javascript应用,也是在javascript api基础上工作,而不用过多考虑其内部的实现。关于javascript api,参见javascript api详解。

二、 javascript engine

javascript engine用于初始化javascript环境,提供对javascript解释、执行的接口。

初始化主要包括:

内存分配:rt=js_init(10000l);

初始化cx:cx = js_newcontext(rt, stack_chunk_size);

初始化globalobj:globalobj = js_newobject(cx, &globalclass, 0, 0);

定义标准类:js_initstandardclasses(cx, globalobj);

定义系统函数:js_definefunctions(cx, globalobj, g_functions);

定义报错函数:js_seterrorreporter(cx,js_errorreporter);

注册其它类:

registerclasspoint(cx,globalobj);

registerclasssize(cx,globalobj);

registerclassrect(cx,globalobj);

registerclasspolygon (cx,globalobj);

registerclasscolorkey (cx,globalobj);

registerclasstdtimer (cx,globalobj);

初始化定时器:tdtimerlistinit();

提供对javascript解释、执行的接口函数:

td_evaluatescript(jscontext *cx,

jsobject *obj,

const char *bytes,

uintn length,

const char *filename,

uintn lineno,

jsval *rval)

三、 javascript与浏览器接合

基本概念:javascript操作html元素的常见方式

例:

<html>
<head>
<script>
<!--
function changeimage(index)
{image0.src="a"+index+".gif";}
-->
</script>
</head>
<a onmouseover="changeimage(0);">军人</a><br>
<a onmouseover="changeimage(1);">眼睛</a><br>
<ccid_file id="image0" values="a0" id="image0" src="a0.gif" /></img>
</html>

当鼠标移到文字上时,触发事件mouseover,调用changeimage()函数,结果为图像源(src)发生变化,重新调入新图片。

由此产生两个关键问题:

1. javascript如何获取html元素的名称和属性。

2. javascript如何改变html元素的属性,并操作widget重画。

下面分别阐述这两个问题:

首先介绍涉及到的浏览器流程:

tokenize -> buildmodel -> processelement -> widgetpaint

---------------------  ----------------------------

   |        |

  parse       layout

问题1解决:html元素作为javascript对象进行注册。

注册过程在buildmodel中进行。

buildmodel的首要任务是将token后的结点按包含关系展成一棵树。

其次就是要将某些结点注册为javascript对象。

注册的过程是:

定义新对象:jsobject *proto;

初始化该对象:td_jsxmlelementclassinit(js_getglobalcontext(),

(void **)&proto))

使用js_defineobject或js_newobject定义对象属性:

根据是否定义了该元素的名称区别对待:

if(td_xmlcontentisnameditem(aelement,&aname))
{
parent = js_getglobalobject();
*areturn=js_defineobject(js_getglobalcontext(),js_getglobalobject(),aname->
mstr,&elementclass,proto,jsprop_enumerate);
}
else
{
parent=aelement->parent->mscriptobject;
*areturn = js_newobject(js_getglobalcontext(), &elementclass, proto, parent);
}

将对象加入:

js_setprivate(js_getglobalcontext(), (jsobject *)*areturn, aelement);

这样,在编译时,html元素的标识就能被javascript编译器识别,否则会报错变量未定义。

问题2解决:利用注册给对象的函数实现操作符的功能化。

具体可理解为:

当image0.src ="1.gif"被执行时,相当于为对象设置或改变属性,此时setelementproperty函数被调用(该函数在注册该对象时由 jsxmlelementclassinit捆绑给该对象,其内容由用户自己定义),setelementproperty通过函数指针调用函数 td_jsxmlsetatrbyid,改变结点树上结点属性,并重新生成该节点对应的widget,重画界面。

问题:如何建立javascript对象与结点树上结点的对应?

答: javascript对象与结点树是同时生成的,它们的共同性质是结点具有相同属性,javascript对象根据id属性查找树,找到要操作的对应结点。

四、 浏览器消息响应

在主消息循环中调用tdwidgetprocessmsg,处理与widget有关消息。

首先:取得当前焦点所在的widgetpwidget=tdwidgetgetatpoint(pthis->basedoc.base.mwidget,pt,&index);

处理该widget对该消息的响应。

最后一般为调用javascript执行,实现实际响应。

tdvoid tdwidgetdoaction(tdpwidgetaction panchor)
{
jsval jval;
if(panchor)
td_evaluatescript(js_getglobalcontext(),js_getglobalobject(),
panchor->maction.mstr,panchor->maction.mlength,tdnull,0,&jval);
}

扫描关注微信公众号