`

javascript动态创建stylesheet

阅读更多
应用场景:

ext的grid中row背景和字体颜色,需要通过读取数据库中配置的颜色来渲染grid。

模块结构:

已经有一个页面进行配置信息的CRUD了,数据库中存储的值形如:#99CCFF
这部分代码就不贴了。

曲折的第一步:
对了本文介绍的模块是基于Extjs3.2版
读取数据:
//获取的级别配置信息
		   var levelArry = null;
//获取配置数据
		    Ext.Ajax.request({
		    	url:'warnlevel.do?method=queryWarnlevelssIsOpen&temp='+new Date(),
		    	success: function(response,options){
		    		levelArry = (Ext.decode(response.responseText));
		    		
		    	},
		    	failure: ''
		    });

/*
			 * 根据告警级别,获取该级别的配置信息
			 */
			function getLevelConfigObj(level_){
				if(levelArry == null){
		    		alert('告警配置数据为空');
		    		return null;
		    	}
				var array = levelArry.wlInfo;
		    	for(index in array){
		    		if(array[index].warnLevel == level_){
		    			return array[index];
		    		}
		    	}
		    	return null;
			}

/*
			 * 计算给定的时间比当前相差的天数;这是一个辅助函数 用于计算相差天数
			 */
			function getOverdueDays(oldDate){
				var _dt = new Date();
				var dt = Date.parseDate(oldDate.substr(0,10), "Y-m-d" );
				return _dt.getDayOfYear() - dt.getDayOfYear();
			}
//为GridPanel加载颜色,reporteventrid就是一个GridPanel,定义部分的代码就不贴,普通的grid
		reporteventrid.getStore().on('load',function(s,records){
			        var girdcount=0;
			        s.each(function(r){
			        	var levels = r.get('severity');
			        	var _time  = r.get('firstTime');//逾期时间
			        	var obj = getWarnRowStyleConfig(levels );
			        	
			        	if(obj!= undefined && obj != null){
			        		var _trtt= reporteventrid.getView().getRow(girdcount);
			        		if(obj.timeoutDays < getOverdueDays(_time)){
			        			//_trtt.style.backgroundColor = obj.timeoutColor;
			        			_trtt.style.color ="#ff0000";//obj.levelFontColor;
			        			//_trtt.style.fontSize = 18+'pt';
			        		}else{
			        			
			        			_trtt.style.color ="#ffffff";//obj.levelFontColor;
			        			//_trtt.style.fontSize = 18+'pt';
			        			//_trtt.style.backgroundColor = obj.levelBgColor;
			        		}
			        		alert('backgroundColor:'+_trtt.style.backgroundColor+' fontStyle: '+_trtt.style.color);
			        		
			        		
			        	}
			            girdcount=girdcount+1;
			        });
			    });


重点是这两句:
_trtt.style.backgroundColor = obj.timeoutColor;
_trtt.style.color ="#ff0000";//obj.levelFontColor;

_trtt 是一个html的tr元素(ext返回时这么说的:指定一个行索引,返回该行的<TR> HtmlElement);上面背景色设置好使,能起作用;但是第二局color字体颜色的设置 无能怎么整都不行,就此卡住了。 注意:俺的浏览器是IE8,FF3.5
上面这种渲染grid是通过循环grid的store数据行来实现的,另有一个弊端不得不说:点击列排序,颜色都没了。。。。


回到原点的解决方案:

ext grid标准的渲染方式是这样的:
css静态文件:
.mystyletest table{background: #ff0000;color: #FFFFFF;}

new Ext.grid.GridPanel({
viewConfig : {
								forceFit : true,
								getRowClass : function(record, rowIndex,rowParams, store) {
         return :'mystyletest'; //style className
}}
.......


一开始我就否决了这种实现方式,很明显,这里的style都是预定义写死在css文件里面的,现在是从后台读取的 #FFFFFF,而js无法IO操作css去修改里面的颜色值吧?
通过Google的帮助,原来可以动态创建stylesheet,由js来创建stylesheet,这就解决了问题

下面这个就是初始化stylesheet的完整代码,渲染grid的时候自己获取className就很简单了
IE8,FF3.5测试通过
//获取级别配置信息
			var levelArry = null;
			/*
			 * 通过数据库数据 初始化Style
			 */
			function initWarnRowStyle(){
		    	if(levelArry == null){
		    		alert('告警配置数据为空');
		    		return;
		    	}
		    	var styleFF = new Array();//FF兼容样式存储下来先
		    	var winSheet = '';
		    	var FFstyle = '';
		    	if(document.all){
		    		winSheet = document.createStyleSheet();
		    	}else{
		    		FFstyle = document.createElement('style');
		    		FFstyle.type = 'text/css';
		    	}
		    	
		    	var array = levelArry.wlInfo;
		    	for(index in array){
		    		var aConfig = array[index]; //一条配置信息对象
		    		var levelClassName = '.warn_'+aConfig.warnLevel;
		    		if(aConfig.warnLevel != ''){
			    			if(document.all){
			    				if(winSheet == '') alert("严重错误请处理");
								winSheet.addRule(levelClassName+' table','background:'+aConfig.levelBgColor+';color:'+aConfig.levelFontColor+';'); 
								winSheet.addRule(levelClassName+'_timeout table','background:'+aConfig.timeoutColor+';color:'+aConfig.levelFontColor+';'); 
						    }else{
						    	styleFF.push(levelClassName+" table{background:"+aConfig.levelBgColor+";color:"+aConfig.levelFontColor+";}");
						    	styleFF.push(levelClassName+'_timeout table{background: '+aConfig.timeoutColor+';color: '+aConfig.levelFontColor+';}');
							}
		    			
		    		}  
		    		
		    	}
		    	if(styleFF.length > 0){
		    		FFstyle.innerHTML=styleFF.join("  ");
		    		document.getElementsByTagName('HEAD').item(0).appendChild(FFstyle);
		    	}
		    }
			//获取配置数据
		    Ext.Ajax.request({
		    	url:'warnlevel.do?method=queryWarnlevelssIsOpen&temp='+new Date(),
		    	success: function(response,options){
		    		levelArry = (Ext.decode(response.responseText));
		    		initWarnRowStyle();//初始化告警StyleSheet
		    	},
		    	failure: ''
		    });







分享到:
评论

相关推荐

    JavaScript动态创建link标签到head里的方法

    本文实例讲述了JavaScript动态创建link标签到head里的方法。分享给大家供大家参考。具体分析如下: 相信有很多做前端的朋友碰到过需要用 JavaScript 动态创建样式表标签——link标签。这里我们就来说说如何在浏览器...

    Javascript动态创建 style 节点

    有很多提供动态创建 style 节点的方法,但是大多数都仅限于外部的 css 文件。如何能使用程序生成的字符串动态创建 style 节点,我搞了2个小时。 静态外部 css 文件语法: @import url(style.css); 动态外部 css 文件...

    JavaScript动态生成css

    ### 一、动态创建CSS规则 在JavaScript中,我们可以利用`document.createElement('style')`来创建一个新的`&lt;style&gt;`元素,然后将其插入到`&lt;head&gt;`或任何其他适当的位置。例如: ```javascript let style = ...

    Change Stylesheet in Javascript.zip

    在JavaScript中,改变样式表(Stylesheet)是前端开发中常见的任务,这涉及到动态更新页面的外观和布局。本教程将深入探讨如何在JavaScript中操作CSS样式表,以实现动态效果,尤其关注游戏场景中的应用。 首先,...

    js-dynamicCreationTable:使用javascript动态创建表格

    js-dynamicCreationTable使用javascript动态创建表格&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt;&lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=...

    动态创建夜空小星星的过程.rar

    这个项目涉及的关键技术包括JavaScript的DOM操作以及动态创建元素,这些是Web开发中的核心技能。 首先,HTML(超文本标记语言)是网页内容的基础结构。在本示例中,我们可能需要一个简单的HTML页面作为画布,可以...

    javascript完全学习手册1 源码

    javascript完全自学手册 目 录 第1篇 JavaScript基础篇 第1章 JavaScript简介 1 1.1 JavaScript概述 1 1.1.1 什么是JavaScript 1 1.1.2 JavaScript的基本特点 2 1.1.3 常用的Web开发语言 3 1.2 JavaScript的应用 4 ...

    JavaScript动态添加style节点的方法

    在探讨JavaScript动态添加style节点的过程中,我们将重点阐述与JavaScript节点操作相关的技术细节。动态添加style节点的方法是Web开发中的常用技术,它允许我们在运行时根据特定的条件或事件向页面中插入样式规则。...

    javascript实现动态导入js与css等静态资源文件的方法.docx

    ### JavaScript 实现动态导入 JS 与 CSS 等静态资源文件的方法 在现代 Web 开发中,动态地加载脚本和样式表是非常常见的需求。这不仅有助于提高网站性能(例如,按需加载资源),还能增强用户体验(例如,在特定...

    javascript完全学习手册2 源码

    第1篇 JavaScript基础篇 第1章 JavaScript简介 1.1 JavaScript概述 1.1.1 什么是JavaScript 1.1.2 JavaScfipt的基本特点 1.1.3 常用的Web开发语言 1.2 JavaScript的应用 1.2.1 客户端应用 1.2.2 服务器...

    JavaScript动态添加css样式和script标签

    JavaScript动态添加CSS样式和script标签的知识点涵盖了Web开发中的客户端脚本编程技术,允许开发者在运行时动态地操作和修改网页的样式和行为。以下是对给定文件中所提到知识点的详细解释: 1. 动态添加CSS样式 - ...

    flex动态加载css实例

    动态加载CSS的方法主要有两种:使用`&lt;link&gt;`标签的`rel="preload"`属性和使用JavaScript动态创建`&lt;link&gt;`标签。 1. 使用`&lt;link rel="preload"&gt;`: 这是一种HTML5的预加载特性,可以提前加载关键资源,如CSS。在`...

    javascript xml xsl xslt

    结合JavaScript和XML、XSLT,开发者可以创建动态且数据驱动的网页。JavaScript可以用来获取XML数据,通过Ajax请求从服务器加载XML文档,然后使用XSLT转换XML数据,最后将转换后的结果插入到HTML文档中,实现页面内容...

    javascript实现动态加载CSS.docx

    在Web开发中,动态加载CSS是一项...总之,JavaScript动态加载CSS是一种强大的工具,能够提升Web应用的性能和用户体验。合理利用这项技术,可以实现按需加载、主题切换等功能,同时优化资源管理,减少不必要的网络请求。

    javascript 动态生成css代码的两种方法

    javascript 动态生成css代码的两种方法 有时候我们需要利用js来动态生成页面上style标签中的css代码,方法很直接,就是直接创建一个style元素,然后设置style元素里面的css代码,最后把它插入到head元素中。但有些...

    使用HTML、CSS和JavaScript来创建图像库和图像展示功能图片浏览网站的网页设计作业代码示例(附详细操作步骤).txt

    - **JavaScript**:用于增加页面的交互性和动态效果。 - **文本编辑器**:推荐使用Sublime Text或Visual Studio Code进行开发。 #### 三、项目结构 项目包含以下几个主要部分: 1. **头部(Header)**:展示网站...

    26、JavaScript中的XML

    JavaScript作为客户端脚本语言,与XML结合可以实现动态数据加载和页面更新,尤其在前后端分离的开发模式中扮演着重要角色。 1. **DOM解析XML** DOM是XML和HTML文档的标准表示方式,它将文档结构转化为对象树。在...

    Javascript实现的换肤

    2. **动态加载CSS**:JavaScript可以通过`&lt;link&gt;`元素来动态加载和替换CSS文件。当用户选择新的皮肤时,可以移除当前皮肤的`&lt;link&gt;`元素,然后创建新的`&lt;link&gt;`元素并插入到`&lt;head&gt;`中。 ```javascript function ...

Global site tag (gtag.js) - Google Analytics