`

ExtJs源码分析与学习—工具类Ext.util.TextMetrics

阅读更多

      Ext提供了一个很有用的工具类Ext.util.TextMetrics,利用该类可以很方便的为一段文字提供一个精确象素级的测量,以便可以得到某段文字的高度和宽度。该类的实现采用了单例模式,即当调用该类时,该类内部属性shared已实例,下次调用时不需再实例化。先看函数的定义

 

Ext.util.TextMetrics = function(){
    var shared;
    return {
        measure : function(el, text, fixedWidth){
            if(!shared){
                shared = Ext.util.TextMetrics.Instance(el, fixedWidth);
            }
            shared.bind(el);
            shared.setFixedWidth(fixedWidth || 'auto');
            return shared.getSize(text);
        },

        createInstance : function(el, fixedWidth){
            return Ext.util.TextMetrics.Instance(el, fixedWidth);
        }
    };
}();

 

      该函数是自执行函数,执行完后该类提供了两个方法measure和createInstance,分别用来测量元素el的大小和创建实例。
      方法measure中三个参数为el测试的DOM对象,text要测量的文字,fixedWidth设置该值可以根据该值压缩文字的多行显示,从而根据行数的不同返回文本的高度,不设置时会默认根据文本显示的行数返回内容的高度。该方法首先实例化要测量的对象,然后绑定el,绑定的过程会设置其与字体相关的css样式,最后返回一段文字的大小。
上面方法中调用的函数实际上在Ext.util.TextMetrics.Instance中定义,函数主体如下

 

Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){
    ...

    var instance = {
      ...
    };

    instance.bind(bindTo);

    return instance;
};

 

      该函数实际上返回闭包变量instance,Ext.util.TextMetrics.Instance中封装了要实现的函数,首先看Instance中的变量

 

var ml = new Ext.Element(document.createElement('div'));
    document.body.appendChild(ml.dom);
    ml.position('absolute');
    ml.setLeftTop(-1000, -1000);
    ml.hide();

    if(fixedWidth){
        ml.setWidth(fixedWidth);
}

    该类定义了辅助div,隐藏显示,用来存放要测试的文字,下面看闭包变量instance中的函数

 

        /**
         * 返回一个指定文字的尺寸。该文字内置元素的样式和宽度属性
         * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
         * Returns the size of the specified text based on the internal element's style and width properties
         * @param {String} text 要测量的文字 The text to measure 
         * @return {Object} An object containing the text's size {width: (width), height: (height)}
         */
        getSize : function(text){
            ml.update(text);
            var s = ml.getSize();
            ml.update('');
            return s;
        },

 注意返回大小后把ml内容清空

 

       /**
         * 绑定某个样式的TextMetrics实例,使得被渲染之文字重新获得CSS样式。
         * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
         * Binds this TextMetrics instance to an element from which to copy existing CSS styles
         * that can affect the size of the rendered text
         * @param {String/HTMLElement} el The element, dom node or id
         */
        bind : function(el){
            ml.setStyle(
                Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')
            );
        },

 绑定时只设置与字体相关的属性

 

        /**
         * 对内置的测量元素设置一个固定的宽度。
         * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
         * Sets a fixed width on the internal measurement element.  If the text will be multiline, you have
         * to set a fixed width in order to accurately measure the text height.
         * @param {Number} width The width to set on the element
         */
        setFixedWidth : function(width){
            ml.setWidth(width);
    },

        /**
         * 返回指定文字的宽度
         * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
         * Returns the measured width of the specified text
         * @param {String} text The text to measure
         * @return {Number} width The width in pixels
         */
        getWidth : function(text){
            ml.dom.style.width = 'auto';
            return this.getSize(text).width;
        },

        /**
         * 返回指定文字的高度,对于多行文本,有可能需要调用 {@link #setFixedWidth} 。
         * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
         * Returns the measured height of the specified text.  For multiline text, be sure to call
         * {@link #setFixedWidth} if necessary.
         * @param {String} text The text to measure
         * @return {Number} height The height in pixels
         */
        getHeight : function(text){
            return this.getSize(text).height;
        }

 

最后为对象Ext.Element提供了一个测量文本宽度的方法

 

Ext.Element.addMethods({
    /**
     * 返回传入文本的宽度,或者该元素下文本的宽度。用该方法即可
     * Returns the width in pixels of the passed text, or the width of the text in this Element.
     * @param {String} 要测试的内容 text The text to measure. Defaults to the innerHTML of the element.
     * @param {Number} min (Optional) The minumum value to return.
     * @param {Number} max (Optional) The maximum value to return.
     * @return {Number} The text width in pixels.
     * @member Ext.Element getTextWidth
     */
    getTextWidth : function(text, min, max){
        return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000);
    }
});

 

下面综合看一个例子

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>Ext.util.TextMetrics测试</title>
		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
		<link rel="stylesheet" type="text/css"
			href="../ext-3.3.1/resources/css/ext-all.css" />
		<script type="text/javascript"
			src="../ext-3.3.1/adapter/ext/ext-base-debug.js"></script>
		<script type="text/javascript"
			src="../ext-3.3.1/ext-all-debug-w-comments.js"></script>
		<script type="text/javascript"
			src="../ext-3.3.1/src/locale/ext-lang-zh_CN.js"></script>
		<script type="text/javascript" src="../ext-3.3.1/src/debug.js"></script>
		<script type="text/javascript">
		        Ext.onReady(function() {
					Ext.BLANK_IMAGE_URL = '../ext-3.3.1/resources/images/default/s.gif';
					Ext.QuickTips.init();
					var textEl = Ext.fly('text');
					var textWidth = textEl.getTextWidth();
					alert(textWidth);
					textEl = Ext.fly('text2');
					var size = Ext.util.TextMetrics.measure(textEl, textEl.dom.innerHTML);
					alert('width:'+size.width+' height:'+size.height);
					//多行的测试,设置宽度时会压缩内容,再根据压缩后的行数返回其高度
					textEl = Ext.fly('text3');
					var size = Ext.util.TextMetrics.measure(textEl, textEl.dom.innerHTML,50);
					alert('多行的测试 width:'+size.width+' height:'+size.height);
					
					//返回一个唯一的TextMetrics实例,直接绑定到某个元素和复用,
                                        //这样会减少在每个测量上初始样式属性的多次调用。
					var metrics=Ext.util.TextMetrics.createInstance('text3');
					metrics.setFixedWidth(100);
					var size=metrics.getSize("中华人民共和国中华人民共和国"
                                             +"中华人民共和国中华人民共和国中华人民共和国中华人民共和国中华人民共和国"
                                             +"中华人民共和国中华人民共和国中华人民共和国中华人民共和国中华人民共和国");
					Ext.MessageBox.alert("getsize",String.format("width:{0}px\theight:{1}px",size.width,size.height))
				});
		</script>
	</head>

	<body>
	<div id='text'>
		要测试的文本要测试的文本要测试的文本
	</div>
	<div id='text2'>
		要测试的文本要测试的文本要测试的文本
	</div>
	<div id='text3'>
		要测试的文本要测试的文本要测试的文本
		要测试的文本要测试的文本要测试的文本
		要测试的文本要测试的文本要测试的文本
	</div>
	</body>
</html>

 工具类Ext.util.TextMetrics到此分析完毕。

分享到:
评论

相关推荐

    ExtJs4.0 使用心得@1 Ext.util.Format.Number()

    `Ext.util.Format`是ExtJS中一个非常实用的工具类,包含了一系列用于字符串、日期和数值等类型的数据格式化的静态方法。`Number()`方法是其中之一,专门用于处理和格式化数字。在实际开发中,我们经常需要将数字以...

    ExtJSWeb应用程序开发指南(第2版)

    6.12 Ext.util.TextMetrics得到块状化文本规格 6.12.1 块的绑定 6.12.2 实例化对象 6.12.3 获取文本的高度 6.12.4 获取文本的宽、高 6.12.5 获取文本的宽度 6.12.6 获取指定节点内文本块的宽、高 6.12.7 指定...

    extjs帮助文档

    - **概述**:Ext.util.TextMetrics类提供了一组用于测量文本尺寸的方法。 - **常用方法**: - `Ext.util.TextMetrics.measureText(text, element)`:测量文本的宽度和高度。 #### 二十三、Ext.XTemplate类(第21页...

    ext_image.rar_ext_image_extjs_extjs 4.2 img_extjs image_extjs图片上

    ExtJS提供了`Ext.Ajax`类来进行异步通信。开发者需要定义一个回调函数来处理成功或失败的情况,并更新用户界面以反映操作结果。 在实际应用中,图片管理还涉及到权限控制、预览、缩放、旋转等功能。这些可以通过...

    extjs帮助文档pdf版

    Ext.util.TextMetrics 类 (P.21) - **概述**:用于测量文本的尺寸。 - **常用方法**: - `Ext.util.TextMetrics.getTextWidth(text, font)`: 获取文本宽度。 - `Ext.util.TextMetrics.getTextHeight(text, font)`...

    extjs4.2 cookies实例

    EXTJS 4.2提供了一个名为`Ext.util.Cookies`的工具类,使得开发者可以方便地进行Cookie的创建、读取和删除。 创建Cookie: EXTJS中创建Cookie主要通过`Ext.util.Cookies.set()`方法完成。例如,要创建一个名为"user...

    ExtJS开发插件及Ext包

    - 开发插件通常涉及创建一个新的JavaScript文件,定义一个类并扩展自`Ext.util.Plugin`或`Ext.grid.Panel`等特定组件的Plugin接口。 - 插件的核心方法是`init`,在这个方法中,你可以向关联的组件添加事件监听器、...

    EXTJS___API详解

    20. **Ext.util.TextMetrics 类**:测量文本在DOM中的尺寸,常用于动态调整元素大小。 21-22. **XTemplate 和 Ext.data.Connection 类**:XTemplate用于渲染数据到HTML,Connection类处理Ajax请求,与服务器交互。 ...

    Ext Js权威指南(.zip.001

    7.4.4 数据集:ext.util.abstractmixedcollection与ext.util.mixedcollection / 330 7.4.5 数据验证及错误处理:ext.data.validations与ext.data.errors / 332 7.4.6 模型的关系:ext.data.association、ext.data...

    Extjs常用函数和事件.pdf

    `Ext.util.CSS`:CSS操作工具,包括创建样式表,获取CSS规则,交换样式表,以及删除样式表。 28-29. `Ext.util.Format`:提供了一系列的格式化方法,如截断字符串(`ellipsis`),首字母大写(`capitalize`)等,方便...

    精通JS脚本之ExtJS框架.part2.rar

    4.4.4 Ext.util.Observable事件 4.4.5 Ext.EventManager事件 4.4.6 Ext.EventObject事件 4.5 各种事件登记方式 4.5.1 传统式登记 4.5.2 内联式登记 4.5.3 Dom Level2登记 4.6 高级组件事件 4.7 ExtJS键盘...

    精通JS脚本之ExtJS框架.part1.rar

    4.4.4 Ext.util.Observable事件 4.4.5 Ext.EventManager事件 4.4.6 Ext.EventObject事件 4.5 各种事件登记方式 4.5.1 传统式登记 4.5.2 内联式登记 4.5.3 Dom Level2登记 4.6 高级组件事件 4.7 ExtJS键盘...

    Ext-JS框架中文文档

    - **Ext.util.Format类**: 提供了一系列字符串格式化的方法,如货币、日期等。 6. **ExtJS组件结构** - **组件分类**: 按照功能和用途对组件进行分类。 - **组件的生命周期**: 组件从创建到销毁的整个过程。 - ...

    ExtJs 中文文档

    - **Ext.util.Format 类**:提供了一系列用于格式化文本的方法,如日期格式化、货币格式化等。 - **XTemplate**:除了基本的模板功能外,还可以结合格式化方法来增强数据展示的效果。 #### 八、ExtJS 组件结构 - *...

    老师整理的extjs学习笔记

    ExtJS 中的所有组件都继承自 `Ext.Component` 类,而 `Ext.Component` 又继承自 `Ext.util.Observable` 类。这意味着所有的组件都具有事件管理的能力。 **3.2 ExtJS 常用组件的继承关系及其管理** ExtJS 提供了...

    ExtJs4_笔记.docx

    4. **函数执行时间控制**:提供`Ext.util.DelayedTask`等工具,延迟或定时执行函数。 5. **键盘事件侦听**:支持键盘事件监听,如`keydown`、`keyup`,便于实现键盘驱动的交互。 **第三章 Ext.Ajax 对ajax的支持** ...

    ext 文件上传

    在EXTJS中,文件上传通常涉及到EXT.form.BasicForm、EXT.form.FileField和EXT.util.Queue等组件。EXT.form.FileField是用于创建一个文件选择输入字段的组件,用户可以通过这个字段选择本地文件进行上传。而EXT.util....

    Ext API详解--笔记

    `EXT核心API详解(一) - Ext类.txt`介绍了Ext的基础类,包括`Ext.util.Observable`(观察者模式的实现)、`Ext.app.Application`(管理应用生命周期)等。理解这些类的用法对于构建可维护的应用至关重要。 4. **Ext...

    深入浅出ExtJS第2版

    深入浅出ExtJS第2版+源码..1 下载EXT发布包 1 1.2 如何查看EXT自带的API和示例 1 1.3 为什么有些示例必须放在服务器上 才能看到效果 2 1.4 Hello World 2 1.4.1 直接使用下载的发布包 2 1.4.2 在项目中使用EXT...

Global site tag (gtag.js) - Google Analytics