浏览器JavaScript支持的实现的一般方法(转)
来源:互联网 发布:mac苹果商店里游戏 编辑:程序博客网 时间:2024/04/29 18:20
浏览器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>
<img 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有关消息。
首先:取得当前焦点所在的widget
pWidget=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);
}
- 浏览器JavaScript支持的实现的一般方法(转)
- 判断浏览器是否支持JavaScript的方法
- 判断浏览器是否支持JavaScript的方法
- 模板方法的一般实现:
- 深入了解JavaScript对浏览器的支持
- 判断浏览器支持的javascript版本
- 非ie浏览器实现javascript的fireEvent方法
- javascript实现浏览器窗口传递参数的方法
- IE浏览器调用OCX控件的一般方法
- 让IE浏览器支持HTML5标准的方法(转)
- 让IE浏览器支持HTML5标准的方法(转)
- 无法实现共享的一般方法
- 检测浏览器是否支持CSS3的方法
- 让浏览器支持html5的方法!
- javascript (二) 支持javascript的几个主流浏览器
- 支持HTMl5的浏览器【转】
- 识别浏览器的JavaScript引擎的方法
- 浏览器的JavaScript引擎的识别方法
- 接口是什么?
- 螺旋方阵
- 道有万千,我取其一
- session对象机制--很详细
- asp中获取多个checkbox的值及改变其状态
- 浏览器JavaScript支持的实现的一般方法(转)
- C的数据库编程
- 4/3系统数码单反
- 博客价值评估工具
- 处理中文乱码的常用方法
- ORACLE公司之起源
- javascript 内制对象与自定义对象
- javascript 内制对象与自定义对象
- 折弯机面试题核心部份算法