来源:2-7 编程练习

メ.甁盖♂

2014-07-07 14:36

done!

写回答 关注

2回答

  • HeavenSky
    2015-06-22 16:34:55
    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';
    }

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

  • メ.甁盖♂
    2014-07-07 14:37:08

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

瀑布流布局

瀑布流布局是网站比较流行的一种布局方式,教你实现三大方式

97740 学习 · 758 问题

查看课程

相似问题

回答 3

回答 1

回答 1

回答 1

回答 14