关于js封装框架类库之样式操作
在js中,对样式的操作我们并不感到陌生,在很多框架中都是用极少的代码,实现更强大的功能,在这做出一些的总结。存在不足还望指出!
1、封装一个添加css的方法(这篇引用了前面的框架结构)
在 js 中 获得样式, 默认只能获得行内样式, 类样式与外部样式无法获得,
可以使用计算样式来获得第一次的结果window.getComputedStyle 获得style对象 建议第一次用
注意: 如果是 低版本的 IE 浏览器, 需要使用 currentStyle
YY.fn.extend({
css: function(cssName,cssValue){
var style = window.getComputedStyle(this[0]);
return style[cssName];
}
}) I(function(){
var res = I('div').css('backgroundColor');
console.log(res);//获得样式值
console.log(typeof res );//string
})
上式是在一个参数情况下,获得可以获得样式值,如果两个参数值了,先考虑设置一个样式值的情况
YY.fn.extend({
css: function (cssName,cssValue){
if(cssValue === undefined){//判断是否有样式值,没有的话就返回
return window.getComputedStyle(this[0])[cssName];
}else{
return this.each(function (){
this.style[cssName]= cssValue;//给每个dom添加属性
});
}
}
})
下面可以设置多个样式值
YY.fn.extend({
css: function ( cssName, cssValue ) {
//判断是否为对象
if ( typeof cssName == 'object' ) {
// 给 this 中每一个 dom 对象都添加 样式
return this.each(function () {
var k;
for ( k in cssName ) {
this.style[ k ] = cssName[ k ];
}
//在这也可以用each方法做,不过要注意this指向的对象
YY.each(cssName,function(i,v){
_this.style[i] = cssName[ i ];
})*/
}); } else if ( cssValue === undefined ) { return window.getComputedStyle( this[ 0 ] )[ cssName ]; } else { // 给所有的元素都添加 该样式
return this.each(function () {
this.style[ cssName ] = cssValue;
});
}
}
});
2、封装关于class系列方法
判断类样式是否有class方法
YY.fn.extend({
hasClass: function ( cName ) { // cName 可能会是多个类样式
// 判断 this[ 0 ] 是否具有该类样式
var has = false;//事先定义一个has
YY.each(this[ 0 ].className.split( ' ' ), function ( i, v ) {
// console.log( this ); // 包装对象
// console.log( v ); // 字符串
if ( v === cName ) {//此处不能用this,this指向字符串数组
has = true;
return false;
}
});
return has; }
});
此处也可这么做
YY.fn.extend({
hasClass: function (cName){
return ( ' ' + this[ 0 ].className + ' ' ).indexOf(
' ' + YY.trim( cName ) + ' ' ) != -1;
}
})
添加class的方法
YY.fn.extend({ addClass: function (cName){
return this.each(function){
// 在处理 CSS 类样式的时候, 实际上就是累加数据
//采用临时变量对其赋值,那么会预先在内存中加载计算,解决浏览器性能问题
var className += ' '+ cName;
//对类样式的空格做出处理
this.className = YY.trim(className);
}
}
});
移除class的方法
第一种方法
YY.fn.extend({
removeClass: function (cName){
return this.each(function(){
//将 DOM 对象的 className的字符串分割成数组
var arr = this.className.split(' '),
l = arr.length,
i;
for( i = 0;i < l;i++){
if(arr[i] === cName){
break;
}
}
//删除数组的第i项
arr.splice(i,1);
//然后把数组每一项放入一个新字符串
this.className = arr.join(' ');
})
} });
第二种方法
YY.fn.extend({
removeClass: function (cName){
// 将 this 中每一个 DOM 对象的 className 属性中符合 cName 的删除掉
return this.each(function(){
//获得DOM 对象的 className
var className = ' '+this.className+ ' ';
//直接将其替代为空
this.className = YY.trim(className.replace(' '+cName+' ',' '))
})
} });
在实现以上方法基础上就很容易实现toggle方法
YY.fn.extend({
toggleClass: function ( cName ) {
if ( this.hasClass( cName ) ) {
this.removeClass( cName );
} else {
this.addClass( cName );
}
}
});
关于js封装框架类库之样式操作的更多相关文章
- 关于js封装框架类库之DOM操作模块(二)
上一篇基本实现了框架结构,但是与真正能用上的项目框架比较还是存在很多不足,在这又做了些加强与优化 (function ( window, undefined ) { var arr = [], pus ...
- 关于js封装框架类库之DOM操作模块(一)
在前端开发的过程中,javascript极为重要的一个功能就是对DOM对象的操作,而对其封装就是为了更好地进行DOM操作,提高浏览器的支持效率 现在给出一个案例:页面创建三个div,然后给其添加样式 ...
- 关于js封装框架类库之属性操作
在对DOM对象操作时,往往都要涉及到其属性的操作,为了提高开发效率,同时兼顾浏览器的性能,在这简单的封装了几个常见的属性.因为是模块化,在这只是引入了部分代码,其他代码在前几篇模块封装中有写.如有不足 ...
- 关于js封装框架类库之事件模块
在触发DOM上的某个事件时,会产生一个事件对象event.这个对象中包含着所有与事件有关的信息.包括导致事件的元素,事件的类型以及其他与特定事件相关的信息. 例如: 鼠标操作点击事件时,事件对象中会获 ...
- 关于js封装框架类库之选择器引擎(一)
选择器模块之传统做法 var tag = function (tag){ return document.getElementsByTagName(tag); } var id = function ...
- 关于js封装框架类库之选择器引擎(二)
在上篇介绍了选择器的获取标签.id.类名的方法,现在我们在上篇基础上继续升级 1.问题描述:上篇get('选择器')已经实现,如果get方法里是一个选择器的父元素,父元素是DOM对象,那么如何获取元素 ...
- JS/jQuery--iframe框架内外元素的操作(转)
JS/jQuery--iframe框架内外元素的操作 原创 2017年12月07日 14:23:09 标签: js / iframe 28 两个问题: 如何在父页面操作iframe框架内的元素? 如何 ...
- DOM操作标签、事件绑定、jQuery框架/类库
DOM操作标签 ''' 在起变量名的时候 如果该变量指向的是一个标签 那么建议使用 xxxEle eg:aEle\pEle\divEle\spanEle ''' # 动态创建一个a标签并添加到页面指定 ...
- JS封装cookie操作函数实例(设置、读取、删除)
本文实例讲述了JS封装cookie操作函数.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
随机推荐
- 关于javascript跨域及JSONP的原理与应用
同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略. 为什么需要同源策略,这里举个例子: 假 设现在没有同源策略,会发生什么事情呢? ...
- 柯南君:看大数据时代下的IT架构(2)消息队列之RabbitMQ-基础概念详细介绍
一.基础概念详细介绍 1.引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松 ...
- poj2328---"right on"进入下一个case的模板(while)
#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { ]; ,end=; w ...
- 梯度下降算法的一点认识(Ng第一课)
昨天开始看Ng教授的机器学习课,发现果然是不错的课程,一口气看到第二课. 第一课 没有什么新知识,就是机器学习的概况吧. 第二课 出现了一些听不太懂的概念.其实这堂课主要就讲了一个算法,梯度下降算法. ...
- libVirt APIs uris (storage,hypervisors)drivers terminologies,glossary xml VMI format
- javascript中的继承方法
从Javascript面向对象编程(二):构造函数的继承这里,可以看到详细的说明. 我只是将其中的例子做成html文件,便于调试罢了. 1. 构造函数绑定 <html> <head& ...
- c# 搭建服务端 常用的Helper(5)
常用的Helper 1.byteHelper :对象与byte[]之间的转换 2.ConvertJson:操作json对象 3.EncodingHelper:对象编码 4.ModelConvertHe ...
- linux下Oracle11g RAC搭建(六)
linux下Oracle11g RAC搭建(六) 五.校验安装前的环境 root身份下完毕解压grid.database安装包 [grid@node1 soft]$ su - Password: [r ...
- .NET平台和C#语言
.NET平台的作用C#语言通过.NET平台来编写 部署 运行.NET应用程序. 为什么学习.NET语言1. C#语言是为.NET平台而生的.2. C#语言是完全面向对象的语言,所以一般情况下我们用C# ...
- MySQL学习笔记(2)
打开数据库 USE db_name; SELECT DATABASE();查看当前所选中的数据库 创建数据表 CREATA TABLE [IF NOT EXISTS] table_name ( col ...