· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [访谈] 网银安全系列访谈之:惊心动魄网银故事
· [热点专题] 网银安全系列 3G上网卡巡礼
· [订阅IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 跨站脚本十二问 四步防范Conficker
· [热点] Windows 7 RC版公开下载 憾缺中文版

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

发布时间:2007.06.05 05:34     来源:赛迪网技术社区    作者:dxaw

一、 基本的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);
}

(责任编辑:龚勋)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 实现JSP数据和JavaScript数据交互使用 (06-04) · 从Java编码中截取给定宽度中英文字符串 (05-18)
· 用Linux系统的安装盘来修复GRUB引导器 (05-16) · 应用实例 JSP+JavaScript打造级连菜单 (05-15)
· Web 2.0应用均有缺陷 问题出在Javascript (04-03) · JS控件autocomplete(自动完成)演示及下载 (11-07)
· 教你两招防病毒 杀毒软件的使用技巧 (10-10) · 用javascript响应表单的提交事件 (09-21)
· JavaScript:世界上误解最深的语言 (05-20) · 立夏已过雷雨将至 警惕“湿度杀手”! (05-10)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
2009第七届中国电脑商年会直播
·创业投资系列访谈:产业..
·特别策划:视频网站系列..
·专题:网游虚拟货币新规..
专题:6月上市手机新品回顾及7月新机展望
·2009年中国电信业信息化..
·专题:把iPhone 3GS“解..
·WAPI重启国际标准进程 ..
专题:09年中盘点-联想春季打印机新品回顾
·InfoComm 2009 视听与集..
·网游背后的故事 网游服..
·[专题]联想ThinkPad T40..
BizSpark:微软为技术创业企业点燃火花
·社区活动:我的IT求知生..
·访谈:内网安全2009系列..
·安全访谈:网银安全之Sa..