早前写的JS选择Class 的函数,不足之处,请高手见谅!
我比较喜欢纯JS,当然Jquery来的更方便一点!
function GetClass(ClassName){
/* kangyangyang 2010-01-12
* 为空获取全部集合
* first 获得集合第一个元素 --异常抛出错误 -- 单个对象
* last 获取集合最后一个元素 --异常抛出错误 -- 单个对象
* eq(1) 获取第二个元素。 下标从0算起 --异常返回全部对象集合 -- 数组对象
* fed(2) 获取前三个 下标从0算起 --异常返回全部对象集合 -- 数组对象
* led(2) 获取后两个 下标从0算起 --异常返回全部对象集合 -- 数组对象
* sub(2,2)获取第二个到第四个 --异常返回全部对象集合 -- 数组对象
*/
var element = new Array(); //对象集合
var way = new Array(); //记录获取方式
var maths = new Array(); //记录获取个数
var mar = false; //false or true 标识作用
var classel; //存储用户输入的Class
if(ClassName){
var Reg = new RegExp(/:{1}/);
if(Reg.test(ClassName)){
way = ClassName.split(":");
way[1]?mar=true:mar=false;
mar?classel=way[0]:classel=ClassName;
way[1] = way[1].toLowerCase();
if((way[1].search(/fed{1}/) != -1) || (way[1].search(/led{1}/) != -1) || (way[1].search(/eq{1}/) != -1)){
maths[0] = Number(way[1].match(/\d{1}/)) + 1;
}else if(way[1].search(/sub{1}/) != -1){
maths[0] = Number(way[1].match(/\d+/g).toString().split(",")[0]) + 1;
maths[1] = Number(way[1].match(/\d+/g).toString().split(",")[1]) + 1;
}
}else{
classel = ClassName;
}
}
var elements = document.getElementsByTagName("*");
for(var i = 0; i < elements.length; i++){
if(elements[i].className == classel){
element[element.length] = elements[i];
}
}
if(!mar){
return element;
}else{
if((maths[0] >= 1 && maths[0] <= element.length) || ((way[1].search(/first{1}/) != -1) || (way[1].search(/last{1}/) != -1))){
if(way[1].search(/first{1}/) != -1){
return element[0];
}else if(way[1].search(/last{1}/) != -1){
return element[element.length - 1];
}else if(way[1].search(/fed{1}/) != -1){
var ele = new Array(); //暂存对象
for(var j = 0;j < maths[0];j++){
ele[ele.length] = element[j];
}
return ele;
}else if(way[1].search(/led{1}/) != -1){
var ele = new Array(); //暂存对象
element = element.reverse();
for(var j = 0;j < maths[0];j++){
ele[ele.length] = element[j];
}
return ele;
}else if(way[1].search(/sub{1}/) != -1){
if(maths[1] >= 1 && maths[1] <= element.length){
var ele = new Array(); //暂存对象
var l = 0;
for(var k = maths[0];k <= element.length;k++){
l++;
if(l <= Number(maths[1])){
ele[ele.length] = element[k - 1];
}
}
return ele;
}else{
return element;
}
}else if(way[1].search(/eq{1}/) != -1){
return element[maths[0]-1];
}
}else{
return element;
}
}
}/* 调用 */
var aa = GetClass("classname:fed(0)"); //取得第一个
我比较喜欢纯JS,当然Jquery来的更方便一点!
function GetClass(ClassName){
/* kangyangyang 2010-01-12
* 为空获取全部集合
* first 获得集合第一个元素 --异常抛出错误 -- 单个对象
* last 获取集合最后一个元素 --异常抛出错误 -- 单个对象
* eq(1) 获取第二个元素。 下标从0算起 --异常返回全部对象集合 -- 数组对象
* fed(2) 获取前三个 下标从0算起 --异常返回全部对象集合 -- 数组对象
* led(2) 获取后两个 下标从0算起 --异常返回全部对象集合 -- 数组对象
* sub(2,2)获取第二个到第四个 --异常返回全部对象集合 -- 数组对象
*/
var element = new Array(); //对象集合
var way = new Array(); //记录获取方式
var maths = new Array(); //记录获取个数
var mar = false; //false or true 标识作用
var classel; //存储用户输入的Class
if(ClassName){
var Reg = new RegExp(/:{1}/);
if(Reg.test(ClassName)){
way = ClassName.split(":");
way[1]?mar=true:mar=false;
mar?classel=way[0]:classel=ClassName;
way[1] = way[1].toLowerCase();
if((way[1].search(/fed{1}/) != -1) || (way[1].search(/led{1}/) != -1) || (way[1].search(/eq{1}/) != -1)){
maths[0] = Number(way[1].match(/\d{1}/)) + 1;
}else if(way[1].search(/sub{1}/) != -1){
maths[0] = Number(way[1].match(/\d+/g).toString().split(",")[0]) + 1;
maths[1] = Number(way[1].match(/\d+/g).toString().split(",")[1]) + 1;
}
}else{
classel = ClassName;
}
}
var elements = document.getElementsByTagName("*");
for(var i = 0; i < elements.length; i++){
if(elements[i].className == classel){
element[element.length] = elements[i];
}
}
if(!mar){
return element;
}else{
if((maths[0] >= 1 && maths[0] <= element.length) || ((way[1].search(/first{1}/) != -1) || (way[1].search(/last{1}/) != -1))){
if(way[1].search(/first{1}/) != -1){
return element[0];
}else if(way[1].search(/last{1}/) != -1){
return element[element.length - 1];
}else if(way[1].search(/fed{1}/) != -1){
var ele = new Array(); //暂存对象
for(var j = 0;j < maths[0];j++){
ele[ele.length] = element[j];
}
return ele;
}else if(way[1].search(/led{1}/) != -1){
var ele = new Array(); //暂存对象
element = element.reverse();
for(var j = 0;j < maths[0];j++){
ele[ele.length] = element[j];
}
return ele;
}else if(way[1].search(/sub{1}/) != -1){
if(maths[1] >= 1 && maths[1] <= element.length){
var ele = new Array(); //暂存对象
var l = 0;
for(var k = maths[0];k <= element.length;k++){
l++;
if(l <= Number(maths[1])){
ele[ele.length] = element[k - 1];
}
}
return ele;
}else{
return element;
}
}else if(way[1].search(/eq{1}/) != -1){
return element[maths[0]-1];
}
}else{
return element;
}
}
}/* 调用 */
var aa = GetClass("classname:fed(0)"); //取得第一个
函数名和变量名的首字母要小写var way = new Array() -> var way = [];
var Reg = new RegExp(/:{1}/); 常态的正则就不要new了,可以直接/:{1}/, 可是/:{1}/是什么呢? 还有下边的fed{1}, led{1}, \d{1} 不解
way[1]?mar=true:mar=false; 不带这么玩的,可以写成: mar = !!way[1]; 下边的mar?classel=way[0]:classel=ClassName;也一样
if((way[1].search(/fed{1}/) != -1) || (way[1].search(/led{1}/) != -1) || (way[1].search(/eq{1}/) != -1)){ 一个正则能解决的问题就不要用多个
maths[0] = Number(way[1].match(/\d{1}/)) + 1; 一个正则操作能解决的问题,就不要用多个
其实你这一整个字符串解析的过程都可以用一个正则来解决 : /[\w\d]+(:(fed|led|eq|sub)\{\s*\d+\s*(\,\d+)?\s*\})?/ (大概写的,没测试)
i < elements.length 这要计算好多次.length
way[1] 常使用的访问最好用有意义的变量保存下来
..........算了,不说了
谢谢牛人指点。至于你说的那个东西,看看注释就知道了
/* kangyangyang 2010-01-12
* 为空获取全部集合
* first 获得集合第一个元素 --异常抛出错误 -- 单个对象
* last 获取集合最后一个元素 --异常抛出错误 -- 单个对象
* eq(1) 获取第二个元素。 下标从0算起 --异常返回全部对象集合 -- 数组对象
* fed(2) 获取前三个 下标从0算起 --异常返回全部对象集合 -- 数组对象
* led(2) 获取后两个 下标从0算起 --异常返回全部对象集合 -- 数组对象
* sub(2,2)获取第二个到第四个 --异常返回全部对象集合 -- 数组对象
*/