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 相关文章推荐
javascript+dom树型菜单类,希望朋友们一起进步
May 03 Javascript
JavaScript 对象模型 执行模型
Oct 15 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
Jan 11 Javascript
document.createElement()用法
Mar 13 Javascript
js中的eventType事件及其浏览器支持性介绍
Nov 29 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
May 02 Javascript
jquery超简单实现手风琴效果的方法
Jun 05 Javascript
100行代码理解和分析vue2.0响应式架构
Mar 09 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
Jul 11 Javascript
使用JS获取SessionStorage的值
Jan 12 Javascript
如何安装控制器JavaScript生成插件详解
Oct 21 Javascript
JS Web Flex弹性盒子模型代码实例
Mar 10 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运行环境配置的详解
2013/06/04 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
js的一些常用方法小结
2011/06/29 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
JavaScript函数详解
2014/11/17 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
JavaScript实现开关等效果
2017/09/08 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
python实现C4.5决策树算法
2018/08/29 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
python sqlite的Row对象操作示例
2019/09/11 Python
python实现电子词典
2020/03/03 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
html Table 表头固定的实现
2019/01/22 HTML / CSS
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
《挑山工》的教学反思
2014/02/16 职场文书
公务员保密承诺书
2014/03/27 职场文书
商铺门前三包责任书
2014/07/25 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
党员违纪检讨书
2015/05/05 职场文书
同事离别感言
2015/08/04 职场文书
创业计划书之家教中心
2019/09/25 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
Minikube搭建Kubernetes集群
2022/03/31 Servers