框架设计续集(四)
时间:2022-06-11
本文章向大家介绍框架设计续集(四),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
对于上述的获取元素的方法,其中有缺陷,在于获取元素都是对整个document进行遍历,在性能方面可以优化
给以前的获取元素都加上第三个参数,上下文(context),意思是在指定的区域查找元素
//---------------------------------
/**
* 假如context是一个dom对象
*/
//假设context是一个dom对象
//对浏览器能力检测
var support ={};
support.getElementsByClassName = (function(){
var isExist = !!document.getElementsByClassName;
console.log(document.getElementsByClassName);
if(isExist && typeof document.getElementsByClassName == "function" ){
var oDivParent = document.createElement("div"),
oDivChild = document.createElement("div");
oDivChild.className = "cc";
oDivParent.appendChild(oDivChild);
return oDivParent.getElementsByClassName("cc")[0] ===oDivChild;
}
return false
})();
//遍历for(){}
function each(arr,fn){
for(var i=0;i<arr.length;i++){
if(fn.call(arr[i],i,arr[i])===false){
break
}
}
}
//单个的获取元素的方法
function getTag(tag,context,results){
results = results || [];
context = context ||document;
results.push.apply(results,context.getElementsByTagName(tag));
return results
}
function getID(id,results){
results = results || [];
results.push(document.getElementById(id));
return results
}
function getClass(classname,context,results){
results = results || [];
context = context ||document;
var arr, i,reg;
if(support.getElementsByClassName){
results.push.apply(results,document.getElementsByClassName(classname));
}else{
arr = context.getElementsByTagName("*");
for( i= 0;i<arr.length;i++){
reg = new RegExp("\b"+classname+"\b");
if(reg.test(arr[i].className)){
results.push(arr[i])
}
}
}
//console.log(results)
return results
}
//对所有的元素的获取
function getElem(selector,context,results){
results = results || [];
context = context ||document;
var regE = /^(?:#([w-]+)|.([w-]+)|([w]+)|(*))$/,
ex = regE.exec(selector);
if(ex){
if(ex[1]){
getID(ex[1],results);
}else if(ex[2]){
getClass(ex[2],context,results);
}else if(ex[3]){
getTag(ex[3],context,results)
}else if(ex[4]){
getTag("*",context,results)
}
}
return results;
}
<div id="con">
<div class="box box1">123</div>
<p class="box box1">pppppppppppppppp</p>
<h4>我是大标题</h4>
</div>
<body>
<script src="js/common1.0.js"></script>
<script>
//对于先前的获取元素的方法都是在document下进行的,性能可以优化
//假定上下文是一个dom元素
var list = getElem(".box",getElem("#con"));
console.log(list);
each(list,function(i,v){
this.style.background = "pink";
})
</script>
//结果(#con下的.box)背景色变粉红
/*
*假如上下文是一个dom对象伪数组
*需要修改的地方就是在调用获取元素函数传的上下文之前进行遍历,选择了在对总的函数进行修改,
*/
//对所有的元素的获取
function getElem(selector,context,results){
results = results || [];
context = context ||document;
var regE = /^(?:#([w-]+)|.([w-]+)|([w]+)|(*))$/,
ex = regE.exec(selector);
if(ex){
//下边的判断是为了加入上下文不传参,代表document,此时下边的遍历在运行时会报错
if(context.nodeType){
context = [context]
}
each(context,function(i,v){
if(ex[1]){
getID(ex[1],results);
}else if(ex[2]){
getClass(ex[2],v,results);
}else if(ex[3]){
getTag(ex[3],v,results)
}else if(ex[4]){
getTag("*",v,results)
}
})
}
return results;
}
//-------------------------------
eg:
<div class="con" id="con">
<div class="box box1">123</div>
<p class="box box1">pppppppppppppppp</p>
<h4>我是大标题</h4>
</div>
<div class="con">
<p class="box box1">我是第二个p标签</p>
<h4 class="box">我是大标题</h4>
</div>
<body>
<script src="js/common1.1.js"></script>
<script>
//对于先前的获取元素的方法都是在document下进行的,性能可以优化
//假定上下文是一个dom元素伪数组
each(getElem(".box",getElem(".con")),function(i,v){
this.style.background = "pink";
})
</script>
/*
加入context传进来的是一个选择器字符串(这个才是真正的实用的)
*/
//对所有的元素的获取
function getElem(selector,context,results){
results = results || [];
context = context ||document;
var regE = /^(?:#([w-]+)|.([w-]+)|([w]+)|(*))$/,
ex = regE.exec(selector);
if(ex){
//在context不传参数时,对document的情况进行转化,
if(context.nodeType){
context = [context]
}
if(typeof context == "string"){
//将选择器字符串转化为dom数组,加上if判断判断的目的是下边函数递归,需要跳出
context = getElem(context);
}
each(context,function(i,v){
if(ex[1]){
getID(ex[1],results);
}else if(ex[2]){
getClass(ex[2],v,results);
}else if(ex[3]){
getTag(ex[3],v,results)
}else if(ex[4]){
getTag("*",v,results)
}
})
}
return results;
}
eg:
<div class="con" id="con">
<div class="box box1">123</div>
<p class="box box1">pppppppppppppppp</p>
<h4>我是大标题</h4>
</div>
<div class="con">
<p class="box box1">我是第二个p标签</p>
<h4 class="box">我是大标题</h4>
</div>
<body>
<script src="js/common1.2.js"></script>
<script>
//对于先前的获取元素的方法都是在document下进行的,性能可以优化
//假定上下文是一个dom元素伪数组
each(getElem(".box",".con"),function(i,v){
this.style.background = "pink";
})
each(getElem(".box1"),function(i,v){
this.style.fontSize= "25px";
this.style.color = "white"
})
</script>
- 工作组模式下专用队列(Private Queue)如何引用远程队列路径
- haproxy反向代理环境部署(http和https代理)
- 网站速度优化模块HttpCompressionModule
- mysql启动后随即关闭问题解决(ibdata1文件损坏导致)
- webvirtmgr-重命名kvm虚拟机的名称
- Lucene 2.0最基本的入门代码
- 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)
- 查看服务器系统资源(cpu,内容)利用率前几位的进程的方法
- 腾讯云平台部总经理陈磊:大数据背后的技术支撑
- DataSet与Xml相互转化
- SqlTransaction事务使用示例
- nginx的web缓存服务环境部署记录
- nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
- [转自blueidea]像table一样布局div Ⅰ
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《剑指offer》第六天:重建二叉树
- Android | 《看完不忘系列》之Glide
- Android | 资源冲突覆盖的一些思考
- 如何获取流式应用程序中checkpoint的最新offset
- Spark之离线统计热点城市信息
- 使用OpenCV实现图像增强
- typescript基础篇(4):函数
- 这样的奇技淫巧,劝你不用也罢
- 一文详解设备ID的那些事儿
- Ansible搭建hadoop-3.1.3高可用
- Android | xml和view的那些事
- Android | Glide细枝篇
- 从源代码编译安装 MonoDevelop 记录
- 在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击
- Hash 算法有哪些?