为了账号安全,请及时绑定邮箱和手机立即绑定

正在回答

2 回答

function getByClass(parent, clsName) {
	var arr = new Array(),
		clsArr = new Array(),
		obj = parent.getElementsByTagName('*');
	for (var i = 0; i < obj.length; i++) {
		clsArr = obj[i].className.split(' ');
		for (var j = 0; j < clsArr.length; j++)
			if (clsArr[j] == clsName) {
				arr.push(obj[i]);
				break;
			}
	}
	return arr;
}

可以先用 **className.split(' ') 将字符串分割成div所包含所有类构成的数组,然后遍历数组是否等于查找类名就行

然而正则匹配需要判断:匹配类在字符串首、尾和中间还有其它类名包含或者用短线组合的类名,等等多种情况

比如 匹配'ades', 有'ades   ades w ades-wer ju-ades  dh ades'等等,可以看出若是RegExp=/\bades\b/这种就不能匹配在字符串首尾的情况,和误匹配到ades-wer中的ades,所以总体最终的正则匹配表达式会复杂许多,

这里给一个我想好久整出来的匹配表达式,理论上最优的是 /(?<=\s|^)ades(?=\s|$)/ig 不过这里js似乎不支持逆序环视匹配“ (?<= ”和“ (?<! ”,所以不行,浏览器报错,

退而求其次, 用这个/(?:\s|^)ades(?=\s|$)/ig ,这个就是可能会匹配到类名前后的空白字符,用非获取匹配 替代 逆序环视,总算匹配出想要的结果了

附上百度百科“正则表达式”词条:http://baike.baidu.com/view/94238.htm

对了下面赠送个人仿照jQuery写的一个函数$('#myid  =myname')表示查找id=myid的标签下的name=myname的所有dom对象,其中=号是仿照id和类自造的一个标志,同理有$('#id .className')等等用法。

function $() {
	if (arguments.length == 0) return document.getElementsByTagName('*');
	else if (arguments.length == 1) var str = arguments[0];
	else if (arguments.length == 2) {
		var parent = arguments[0];
		var str = arguments[1];
		if (!isDOM(parent)) return null;
	}
	else return null;
	var obj = parent ? parent : document;
	var arr1 = str.match(/^([#|\.|\=]?)([\w-]+)$/);
	var arr2 = str.match(/^#([\w-]+) ([#|\.|\=]?[\w-]+)$/);
	if (arr1) {
		switch (arr1[1]) {
		case '#':
			return obj.getElementById(arr1[2]);
		case '=':
			return obj.getElementsByName(arr1[2]);
		case '.':
			return getByClass(obj, arr1[2]);
		default:
			return obj.getElementsByTagName(arr1[2]);
		}
	}
	if (arr2) {
		var subObj = obj.getElementById(arr2[1]);
		return $(subObj, arr2[2]);
	}
	return null;
}

function getByClass(parent, clsName) {
	var arr = new Array(),
		clsArr = new Array(),
		obj = parent.getElementsByTagName('*');
	for (var i = 0; i < obj.length; i++) {
		clsArr = obj[i].className.split(' ');
		for (var j = 0; j < clsArr.length; j++)
			if (clsArr[j] == clsName) {
				arr.push(obj[i]);
				break;
			}
	}
	return arr;
}

function isDOM(obj) {
	if (typeof HTMLElement === 'object') return obj instanceof HTMLElement;
	else return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
}

人懒就没写注释,凭字面意思看吧

1 回复 有任何疑惑可以回复我~

getClassName这个函数 如果是一个div上有两个className怎么解决?请大牛给予帮助,谢谢!

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信