使浏览器实现JavaScript支持的方法解析
2010-09-14 13:04:09 来源:WEB开发网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);
}
Tags:浏览器 实现 JavaScript
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接