- 浏览: 1162643 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhizhen23:
LZ 提供的链接地址失效了
重写的isPlainObject方法 -
LovingBaby:
LovingBaby 写道function fun() {}f ...
读jq之二(两种扩展) -
LovingBaby:
说的很清楚!jQuery作者为了实现简洁调用的苦心!高超的编程 ...
读jq之一(jq对象的组成) -
hard_ly:
...
将伪数组转换成数组 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,例如二十六进制、十二进制又该如何 ...
用递归实现十进制数转换N进制
上篇看了ext-base-event.js(Ext.lib.Event),这篇看ext-base-dom.js(Ext.lib.Dom)。
后续EventManager.js(Ext.EventManager)其中会用到该篇的Ext.lib.Dom。
整体浏览ext-base-dom.js可以看到还是一个匿名函数执行,与上一篇不同的是这次并非返回包装好的对象pub,而是直接将对象赋值给Ext.lib.Dom。
(function(){ var doc = document, ...; Ext.lib.Dom = { ... }; })();
一些变量声明,
var doc = document, isCSS1 = doc.compatMode == "CSS1Compat", MAX = Math.max, ROUND = Math.round, PARSEINT = parseInt;
doc、Max、ROUND、PARSEINT为简写。好处在上一篇已经提到,clue
还提到了这样写提高了压缩率。即document,Math.max等不会被压缩工具进行名称替换,doc,MAX等则会,可用 YUI Compressor
测试下。
isCSS1用来判断浏览器的文档模式(doctype),为true是标准模式,false是怪异模式。第一篇
提到了Ext.js中有个Ext.isStrict,和这里的isCSS1是一样的。
Ext作者没有使用Ext.isStrict而是新增了一个变量isCSS1个人猜测原因同doc,MAX,亦或是为了保持此处代码一致性。
接下来是Ext.lib.Dom对象的定义,先看第一个方法,
isAncestor : function(p, c) { var ret = false; p = Ext.getDom(p); c = Ext.getDom(c); if (p && c) { if (p.contains) { return p.contains(c); } else if (p.compareDocumentPosition) { return !!(p.compareDocumentPosition(c) & 16); } else { while (c = c.parentNode) { ret = c == p || ret; } } } return ret; },
这个方法用来判断元素c(child)是否是p(parent)的子节点。这里有contains和compareDocumentPosition各浏览器 兼容列表
。这个方法与ext-base-event.js的私有方法elContains(上一篇已提到)作用类似,不知为何Ext作者要冗余。
接下来是几个获取视图,文档,视窗宽高的方法,
getViewWidth : function(full) { return full ? this.getDocumentWidth() : this.getViewportWidth(); }, getViewHeight : function(full) { return full ? this.getDocumentHeight() : this.getViewportHeight(); }, getDocumentHeight: function() { return MAX(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, this.getViewportHeight()); }, getDocumentWidth: function() { return MAX(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, this.getViewportWidth()); }, getViewportHeight: function(){ return Ext.isIE ? (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) : self.innerHeight; }, getViewportWidth : function() { return !Ext.isStrict && !Ext.isOpera ? doc.body.clientWidth : Ext.isIE ? doc.documentElement.clientWidth : self.innerWidth; },
这里仅讲述宽。
getViewportWidth 获取视口的宽。即怪异模式且非Opera使用doc.body.clientWidth获取,IE使用doc.documentElement.clientWidth获取,其它浏览器使用self.innerWidth获取。
getDocumentWidth 获取文档的宽。我们知道如果文档中出现水平滚动条,那么文档的宽将大于视口。因此比较scroll宽度和文档宽度,取其中较大的。
这里仍仍然需要区分浏览器的文档模式,怪异模式使用doc.body.scrollWidth,标准模式使用doc.documentElement.scrollWidth获取。
getViewWidth 是对以上两个方法的封装,full为true则取整个文档宽(含滚动),否则只取文档可视区域宽。
接下来是获取元素相当于文档的位置方法,
getY : function(el) { return this.getXY(el)[1]; }, getX : function(el) { return this.getXY(el)[0]; }, getXY : function(el) { var p, pe, b, bt, bl, dbd, x = 0, y = 0, scroll, hasAbsolute, bd = (doc.body || doc.documentElement), ret = [0,0]; el = Ext.getDom(el); if(el != bd){ if (el.getBoundingClientRect) { b = el.getBoundingClientRect(); scroll = fly(document).getScroll(); ret = [ROUND(b.left + scroll.left), ROUND(b.top + scroll.top)]; } else { p = el; hasAbsolute = fly(el).isStyle("position", "absolute"); while (p) { pe = fly(p); x += p.offsetLeft; y += p.offsetTop; hasAbsolute = hasAbsolute || pe.isStyle("position", "absolute"); if (Ext.isGecko) { y += bt = PARSEINT(pe.getStyle("borderTopWidth"), 10) || 0; x += bl = PARSEINT(pe.getStyle("borderLeftWidth"), 10) || 0; if (p != el && !pe.isStyle('overflow','visible')) { x += bl; y += bt; } } p = p.offsetParent; } if (Ext.isSafari && hasAbsolute) { x -= bd.offsetLeft; y -= bd.offsetTop; } if (Ext.isGecko && !hasAbsolute) { dbd = fly(bd); x += PARSEINT(dbd.getStyle("borderLeftWidth"), 10) || 0; y += PARSEINT(dbd.getStyle("borderTopWidth"), 10) || 0; } p = el.parentNode; while (p && p != bd) { if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) { x -= p.scrollLeft; y -= p.scrollTop; } p = p.parentNode; } ret = [x,y]; } } return ret },
核心是getXY方法,getX和getY都是调用getXY。获取html元素在页面中(窗口客户区域)的位置(top,left)不是件容易的事。
该方法实现用到了Ext.Element相关方法,后续阅读。
接下来是设置元素位置的方法,
setXY : function(el, xy) { (el = Ext.fly(el, '_setXY')).position(); var pts = el.translatePoints(xy), style = el.dom.style, pos; for (pos in pts) { if(!isNaN(pts[pos])) style[pos] = pts[pos] + "px" } }, setX : function(el, x) { this.setXY(el, [x, false]); }, setY : function(el, y) { this.setXY(el, [false, y]); }
核心是setXY,setX和setY都是调用setXY。setXY也依赖于Ext.fly,Ext.fly实际上是Ext.Element.fly。后续阅读。
- ext-base-dom.rar (1.4 KB)
- 下载次数: 45
评论
var rd = Ext.getDom('regVerCode');
var rd0 = Ext.get(rd.parentNode);
rd0.createChild({
tag: 'img',
src: '/Captcha.jpg',
width: '80',
height: '25',
align: 'absbottom',
onclick: "this.src=getCaptcha()",
title: "点击刷新验证码"
});
发表评论
-
读Ext之十五(操作批量元素)
2011-02-07 09:14 2180前两篇读了Ext.Element,这篇介绍的Ext.Compo ... -
读Ext之十四(Ext元素)
2011-01-18 14:57 2159上篇读了Ext.Element的部分方法,这篇继续。El.ad ... -
读Ext之十三(Ext元素)
2011-01-16 16:57 1980终于越来越接近Ext的核心了。这篇开始Ext.Element, ... -
读Ext之十二(在各个位置插入元素)
2011-01-13 13:17 7762IE 除了发明 innerHTML这个快捷创建DOM元素(及其 ... -
Ext core 3.1.0的一个大Bug
2011-01-12 19:28 6500Ext core 3.1.0(下载地址 )中Ext.DomH ... -
读Ext之十一(通过innerHTML创建元素)
2011-01-09 22:19 2047innerHTML 这个由 IE 引入的属性成了事实标准, ... -
读Ext之十(解析JSON)
2011-01-03 11:36 4517首先,回到第一篇 。 ... -
读Ext之九(事件管理)
2010-12-08 08:39 2953Ext的事件管理非常强大。主要定义在Ext.EventMana ... -
读Ext之八(原生事件对象的修复及扩充)
2010-11-27 18:51 2269Ext库也对浏览器原生的事件对象做了包装,以保证兼容所有浏览器 ... -
读Ext之七(多任务定时管理)
2010-11-25 17:24 2766Ext.util.TaskRunner 用来管理多任务定时管理 ... -
读Ext之六(延迟任务的执行)
2010-11-24 17:36 3923Ext.util.DelayedTask类从名字上就可以看出它 ... -
读Ext之四(事件的低级封装)
2010-11-11 17:10 3448十一前读了Ext core的Ext.js,这篇开始读ext-b ... -
读Ext之三(原型扩展)
2010-09-30 09:51 3137续上篇, Ext.ns = Ext.name ... -
读Ext之二(实用方法)
2010-09-24 16:37 4939上篇看到Ext.extend,接着往下看。 Ext.n ... -
读Ext之一(实用方法)
2010-09-24 10:19 4032第一句 window.undefined = window. ...
相关推荐
"读Ext之十五(操作批量元素)"这篇博客文章可能详细讲解了如何在ExtJS中对多个DOM元素进行批量操作,这对于提高代码效率和减少重复工作至关重要。在ExtJS中,处理一组元素时,我们通常会使用CompositeElementLite类...
总的来说,"读Ext之十三(Ext元素)"这个主题涵盖的内容广泛,包括了Ext.js中对DOM元素的全方位操作,这对于任何希望使用Ext.js开发Web应用的人来说都是至关重要的知识点。通过深入研究Element.js源码,我们可以掌握...
本文将深入探讨“读Ext之十二(在各个位置插入元素)”这一主题,主要关注如何利用ExtJS中的DomHelper工具来高效地在DOM树中插入元素。 首先,DomHelper是ExtJS中用于操作DOM的一个重要工具类,它的主要职责是创建...
本文将详细讲解关于"ext grid 封装"的知识点,以及如何通过`grid.js`来实现UI的便捷调用。 1. ExtJS Grid组件: - Grid组件是ExtJS的核心组件之一,用于显示表格数据,支持排序、分页、筛选等多种功能。 - 它由一...
在深入探讨“读Ext之十(解析JSON)”这一主题之前,我们首先需要理解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,设计简单且易于人阅读和编写,同时...
简单ext封装 封装了一个布局 封装文件中前面部分是封装部分 后面部分是对封装的使用
在本文中,我们将深入探讨`Ext.tree.TreeLoader`与JSON数据在Ext JS框架中的应用。`Ext.tree.TreeLoader`是Ext JS库中的一个组件,它负责加载和解析树形结构的数据,而JSON(JavaScript Object Notation)则是一种轻...
在JavaScript的世界里,异步编程是核心之一,而延迟任务的执行则是异步处理中的重要概念。本篇文章将深入探讨“延迟任务的执行”,通过分析`DelayedTask.js`这个文件,我们可以了解到如何在Ext框架中实现延迟任务。...
对ext Grid进行了封装,动态加载数据源,动态生成列
Linux最常用的文件系统类型之一就是EXT系列,包括EXT2、EXT3和EXT4。然而,Windows操作系统默认并不支持直接读取这些格式的分区。这时,就需要借助第三方工具来实现这一目标,例如“Windows读取Ext4分区的工具”——...
- **内存占用**:由于`Ext.get`会将DOM元素封装成`Ext.Element`对象并缓存起来,因此可能会导致内存占用增加,尤其是在处理大量元素时。 - **资源消耗**:如果频繁使用`Ext.get`来获取相同的元素,则每次调用都会...
可以读写Ext2,以Ext2方式挂载Ext3文件系统(不支持Ext3日志),不支持中文! It provides Windows NT4.0/2000/XP/2003/Vista/2008 with full access to Linux Ext2 volumes (read access andwrite access). This ...
代码功能: 1、利用io端口读磁盘 2、读ext2文件系统中的文件 注意: 1、代码只在ring0状态下测试通过。 2、代码没有读分区表的功能,group0的位置是通过...3、此代码仅作为用io端口读磁盘和读ext2文件系统的参考代码。
EXT的核心是Element对象,它封装了DOM元素操作,提供了诸如选择、遍历、样式设置、事件处理等一系列功能。Element对象是EXT处理页面DOM结构的基础,通过它可以方便地操作页面上的任何元素。例如,EXT提供了一种简便...
"EXT核心API详解(五)-Ext.EventManager EventObject CompositeElement CompositeElementLite.txt"涉及到EXT的事件管理系统。EventManager负责事件的注册、解注册和分发,优化了浏览器之间的事件处理兼容性。...
本书以幽默诙谐的语言由浅入深地解析了Ext框架的方方面面,包括JS基础、Ext的DOM和CSS封装、内置对象的扩展、事件系统、Ajax和Direct、数据和缓存架构、面向对象和继承、UI组件、布局管理、模板、特效、图表和报表、...
"Ext的Tab标签封装"指的是使用ExtJS库创建的TabPanel组件,它允许用户在一个区域内通过点击不同的标签来展示不同的内容面板。 在描述中提到的"兼容Firefox 和 IE浏览器",这意味着该封装方法考虑到了跨浏览器的兼容...
`Ext.Element`是Ext Js中的基础元素操作类,它封装了对DOM元素的各种操作,如尺寸调整、样式修改、事件处理等。在`EXT核心API详解(三)-Ext.Element.txt`中,你将了解到如何选择元素、添加和移除CSS类、处理事件、...
`Ext.Element`类是对DOM的封装,它可以为每个DOM节点创建一个对应的`Element`对象,从而通过`Element`对象的方法实现对DOM的操作,例如隐藏元素或添加拖放功能。 **语法**: ```javascript Ext.get(selector) ``` *...