Extjs学习笔记之五 一个小细节renderTo和applyTo的区别


Posted in Javascript onJanuary 07, 2010

ExtJS中的renderTo和applyTo的差别

对applyTo和renderTo的理解和思考

个人认为这两篇文章写的不够通俗。写一个简单的例子来看看最终生成了什么代码,

<head> 
<title>RenderTo and ApplyTo</title> 
<link rel="Stylesheet" type="text/css" href="ext-3.1.0/resources/css/ext-all.css" /> 
<script type="text/javascript" src="ext-3.1.0/adapter/ext/ext-base-debug.js"></script> 
<script type="text/javascript" src="ext-3.1.0/ext-all-debug.js"></script> 
<script type="text/javascript" src="ext-3.1.0/src/locale/ext-lang-zh_CN.js"></script> 
<script type="text/javascript"> 
Ext.onReady(function() { 
var button = new Ext.Button({ 
renderTo: 'button', 
text:'OK' 
}); }); 
</script> 
</head> 
<body> 
<div id="button">sadfa</div> 
</body> 
</html>

此代码生成的html如下:
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别 
如果是applyTo:button,则生成的代码为:

Extjs学习笔记之五 一个小细节renderTo和applyTo的区别

很明显,简单的说,applyTo是将组件加在了指定元素之后,而renderTo则是加在指定元素之内

接下来,我们再稍稍探寻下extjs源码的奥秘。看看extjs内部是如何使用这两个配置项的,利用firebug插件调试一下ext-all-debug.js这个文件。

在Ext.Component的构造函数Ext.Component = function(config){…}中有这样一段代码(3.1.0版本是9270行):

if(this.applyTo){ 
this.applyToMarkup(this.applyTo); 
delete this.applyTo; 
}else if(this.renderTo){ 
this.render(this.renderTo); 
delete this.renderTo; 
}

可见applyTo属性使得Component调用applyToMarkup方法,而renderTo使得它调用render方法,并且如果两个都设置的话仅有applyTo有效,这点在extjs的文档中也有特别指出。

appylToMarkup方法如下(3.1.0版本是9560行),

applyToMarkup : function(el){ 
this.allowDomMove = false; 
this.el = Ext.get(el); 
this.render(this.el.dom.parentNode); 
}

它最终调用的也是render,不过render的位置是parentNode,render方法如下(3.1.0版本是9370行)
render : function(container, position){ 
if(!this.rendered && this.fireEvent('beforerender', this) !== false){ 
if(!container && this.el){ 
this.el = Ext.get(this.el); 
container = this.el.dom.parentNode; 
this.allowDomMove = false; 
} 
this.container = Ext.get(container); 
if(this.ctCls){ 
this.container.addClass(this.ctCls); 
} 
this.rendered = true; 
if(position !== undefined){ 
if(Ext.isNumber(position)){ 
position = this.container.dom.childNodes[position]; 
}else{ 
position = Ext.getDom(position); 
} 
} 
this.onRender(this.container, position || null); 
if(this.autoShow){ 
this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]); 
} 
if(this.cls){ 
this.el.addClass(this.cls); 
delete this.cls; 
} 
if(this.style){ 
this.el.applyStyles(this.style); 
delete this.style; 
} 
if(this.overCls){ 
this.el.addClassOnOver(this.overCls); 
} 
this.fireEvent('render', this); var contentTarget = this.getContentTarget(); 
if (this.html){ 
contentTarget.update(Ext.DomHelper.markup(this.html)); 
delete this.html; 
} 
if (this.contentEl){ 
var ce = Ext.getDom(this.contentEl); 
Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']); 
contentTarget.appendChild(ce); 
} 
if (this.tpl) { 
if (!this.tpl.compile) { 
this.tpl = new Ext.XTemplate(this.tpl); 
} 
if (this.data) { 
this.tpl[this.tplWriteMode](contentTarget, this.data); 
delete this.data; 
} 
} 
this.afterRender(this.container); 
if(this.hidden){ 
this.doHide(); 
} 
if(this.disabled){ 
this.disable(true); 
} 
if(this.stateful !== false){ 
this.initStateEvents(); 
} 
this.fireEvent('afterrender', this); 
} 
return this; 
}

render方法看起来比较复杂,仔细阅读下其实也不是太难,主要就是为一个DOM节点设置class,可见性,在onRender方法中会对这个组件生成相应的html代码。
对applyTo和renderTo的理解和思考 中提到的el配置属性,我查extjs的文档发现这是一个只读属性,虽然有方法覆盖它,不过一般不需要手动设置,下面是Panel的公共属性el的文档原文:

el : Ext.Element

The Ext.Element which encapsulates this Component. Read-only.

This will usually be a <DIV> element created by the class's onRender method, but that may be overridden using the autoEl config.

Note: this element will not be available until this Component has been rendered.

所以我估计此文写的是以前版本的extjs。个人认为,el是紧包裹着extjs组件的一个DOM节点,一般是由extjs自己生成的,好像细胞膜一样,如果拨开了它,那么这个组件就不完整了,很可能会表现的不正常。而render方法中的container(也就是applyTo中指定元素的父元素,renderTo中指定的元素),是该组件的父元素,这个container中可以包括其他的html元素或者extjs组件。

综上所述,其实applyTo和renderTo没有很本质区别,只是render的位置不同。

Javascript 相关文章推荐
会自动逐行上升的文本框
Jun 30 Javascript
再谈javascript面向对象编程
Mar 18 Javascript
页面回到顶部的三种实现(锚标记,js)
Oct 01 Javascript
jquery 定位input元素的几种方法小结
Jul 28 Javascript
js返回上一页并刷新的多种实现方法
Feb 26 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
Sep 22 Javascript
node.js中的fs.lstat方法使用说明
Dec 16 Javascript
JavaScript对象反射用法实例
Apr 17 Javascript
jquery平滑滚动到顶部插件使用详解
May 08 jQuery
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
node错误处理与日志记录的实现
Dec 24 Javascript
EXT中xtype的含义分析
Jan 07 #Javascript
Extjs学习笔记之四 工具栏和菜单
Jan 07 #Javascript
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 #Javascript
Extjs学习笔记之二 初识Extjs之Form
Jan 07 #Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
Jan 07 #Javascript
jQuery DOM操作小结与实例
Jan 07 #Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
Jan 05 #Javascript
You might like
PHP实现MySQL更新记录的代码
2008/06/07 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
js过滤数组重复元素的方法
2010/09/05 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
Django对数据库进行添加与更新的例子
2019/07/12 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
python退出循环的方法
2020/06/18 Python
python使用列表的最佳方案
2020/08/12 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
小学教师学期末自我评价
2013/09/25 职场文书
法律专业推荐信范文
2013/11/29 职场文书
四议两公开实施方案
2014/03/28 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
工程安全生产协议书
2014/11/21 职场文书
接收函格式
2015/01/30 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
Python制作动态字符画的源码
2021/08/04 Python
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL