javascript getElementsByClassName函数


Posted in Javascript onApril 01, 2010

今天在网上看到的一个根据ClassName获取Elements的脚本,在此记录一下,以便日后使用。

var getElementsByClassName = function(searchClass, node, tag) { 
if (document.getElementsByClassName) { 
return document.getElementsByClassName(searchClass) 
} else { 
node = node || document; 
tag = tag || "*"; 
var classes = searchClass.split(" "), 
elements = (tag === "*" && node.all) ? node.all : node.getElementsByTagName(tag), 
patterns = [], 
returnElements = [], 
current, 
match; 
var i = classes.length; 
while (--i >= 0) { 
patterns.push(new RegExp("(^|\\s)" + classes[i] + "(\\s|$)")); 
} 
var j = elements.length; 
while (--j >= 0) { 
current = elements[j]; 
match = false; 
for (var k = 0, kl = patterns.length; k < kl; k++) { 
match = patterns[k].test(current.className); 
if (!match) break; 
} 
if (match) returnElements.push(current); 
} 
return returnElements; 
} 
}

下面是网上其它的一些相关介绍,大家可以一起参考下。

DOM中的getElementsByClassName解释如下:DOM API 中提供3种方法取元素(getElementById,getElementsByName,getElementsByTagName),经常编写CSS的人自然就会产生疑问,有没有根据样式类名取元素的方法,可惜,DOM1/2 里面都没有这样的方法,prototype 很早就扩展过DOM的方法,添加了 getElementsByClassName,从方法名上看,似乎非常正统,与前面3种方法名称也像,分析其代码,却发现还是通过 getElementsByTagName 来实现。这个方法称不上优雅,因为需要遍历所有的元素,探测元素是否包含目标样式类名,返回符合条件的元素数组。google了一下,却没有找到更优雅高效的替代方法。

function getElementsByClassName(className, parentElement){ 
var elems = ($(parentElement)||document.body).getElementsByTagName("*"); 
var result=[]; 
for (i=0; j=elems[i]; i++){ 
if ((" "+j.className+" ").indexOf(" "+className+" ")!=-1){ 
result.push(j); 
} 
} 
return result; 
}

既然有getElementsByClassName,一样可以有 getElementsByAttribute(如:getElementsByValue、getElementsByStyle、getElementsByType)
document.getElementsByClassName = function(className,oBox) { 
//适用于获取某个HTML区块内部含有某一特定className的所有HTML元素 
this.d= oBox || document; 
var children = this.d.getElementsByTagName('*') || document.all; 
var elements = new Array(); 
for (var ii = 0; ii < children.length; ii++) { 
var child = children[ii]; 
var classNames = child.className.split(' '); 
for (var j = 0; j < classNames.length; j++) { 
if (classNames[j] == className) { 
elements.push(child); 
break; 
} 
} 
} 
return elements; 
} document.getElementsByType = function(sTypeValue,oBox) { 
//适用于获取某个HTML区块内部同属于某一特定type的所有HTML元素,如:input,script,link等等 
this.d= oBox || document; 
var children = this.d.getElementsByTagName('*') || document.all; 
var elements = new Array(); 
for (var ii = 0; ii < children.length; ii++) { 
if (children[ii].type == sTypeValue) { 
elements.push(children[ii]); 
} 
} 
return elements; 
} 
function $() { 
var elements = new Array(); 
for (var ii = 0; ii < arguments.length; ii++) { 
var element = arguments[ii]; 
if (typeof element == 'string') 
element = document.getElementById(element); 
if (arguments.length == 1) 
return element; 
elements.push(element); 
} 
return elements; 
} 
$Cls = function (s,o){ 
return document.getElementsByClassName(s,o); 
}; 
$Type = function (s,o){ 
return document.getElementsByType(s,o); 
}; 
$Tag = function (s,o){ 
this.d=o || document; 
return this.d.getElementsByTagName(s); 
}; 
$Name = function (s){ //通过name的方式只能针对整个document而言,不能为其限定范围 
return document.getElementsByName(s); 
};
Javascript 相关文章推荐
javascript attachEvent和addEventListener使用方法
Mar 19 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
Apr 23 Javascript
JavaScript使用cookie实现记住账号密码功能
Apr 27 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
Aug 05 Javascript
vue+element实现批量删除功能的示例
Feb 28 Javascript
基于Node.js搭建hexo博客过程详解
Jun 25 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
Mar 10 Javascript
比较node.js和Deno
Apr 27 Javascript
JS getStyle获取最终样式函数代码
Apr 01 #Javascript
Javascript 通过json自动生成Dom的代码
Apr 01 #Javascript
JS中confirm,alert,prompt函数使用区别分析
Apr 01 #Javascript
JavaScript中实现块作用域的方法
Apr 01 #Javascript
cloudgamer出品ImageZoom 图片放大效果
Apr 01 #Javascript
js 异步处理进度条
Apr 01 #Javascript
JavaScript中String和StringBuffer的速度之争
Apr 01 #Javascript
You might like
浅析PHP中Collection 类的设计
2013/06/21 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
PDO::setAttribute讲解
2019/01/29 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
python 正则表达式 概述及常用字符
2009/05/04 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
UNIX文件系统常用命令
2012/05/25 面试题
售后主管岗位职责
2013/12/08 职场文书
护士长竞聘书
2014/03/31 职场文书
健康家庭事迹材料
2014/05/02 职场文书
给公司的建议书范文
2014/05/13 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python