`
satanultra
  • 浏览: 10691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己实现的简单的html元素选择器

阅读更多
最近做前端,需要选择元素,虽说有jquery和各大js库已经帮我造好了轮子,但我想试试自己实现一个,正好项目也不忙,正好加入自己的js文件中,下面是实现代码。用$g("#content .op")这种格式就可以调用,和jquery $()的参数一样:
function $findChilds(parentNode, text)
{
	//如果不传入父节点的话,默认为body
	if(parentNode == undefined)
		parentNode = document.body;
	var childNodes = parentNode.childNodes;
	var results = [];
	//子节点大于零才循环
	if(childNodes.length > 0)
	{
		var length = childNodes.length;
		//循环查找符合text的节点
		for(var i=0;i<length;++i)
		{
			//三种情况,className,id, tagName
			switch(text.substr(0, 1))
			{
			case '.':
				//这两种:parentNode.getElementsByClassName,parentNode.all都是后来加上的,如果浏览器这两种方法都不支持,那就只能暴力递归了
				if(parentNode.getElementsByClassName)
					return parentNode.getElementsByClassName(text.substr(1));
				else if(parentNode.all)
				{
					var finded = [];
					var jlength = parentNode.all.length;
					for(var j=0;j<jlength;++j)
						if(parentNode.all[j].className == text.substr(1))
							finded.push(parentNode.all[j]);
					return finded;
				}
				//以上两种方法都不支持,直接判断
				if(childNodes[i].className == text.substr(1))
					results.push(childNodes[i]);
				break;
			case '#':
				return [document.getElementById(text.substr(1))];
			default:
				return parentNode.getElementsByTagName(text);
			}
			//判断完后,把当前子元素的子元素传入$findChilds进行递归查找,返回的结果直接和现在的结果合并
			results = results.concat($findChilds(childNodes[i], text));	
		}
	}
	return results;
}

String.prototype.vtrim = function() {
	  return this.replace(/^\s+|\s+$/g, '');
}

function $g(text)
{
    //按照空格分割参数
	var values = text.vtrim().split(" ");
	var length = values.length;
    //如果只有一个选择参数的话,就直接调用dom方法返回结果。
	if(length == 1)
		switch(values[0].substr(0, 1))
		{
		case "#":
			return document.getElementById(values[0].substr(1));
		case ".":
			if(document.getElementsByClassName)
				return document.getElementsByClassName(values[0].substr(1));
		default:
			return document.getElementsByTagName(values[0]);
		}
	//每次迭代都会产生许多符合参数的结果节点,这里结果节点的名称为parentNodes,第一次循环默认为body
	var parentNodes = [document.body];
    //外层循环为迭代每个传入的参数
	for(var i = 0; i < length; ++i)
	{
		var jlength = parentNodes.length;
		var results = [];
		//这里如果values的长度为零的话,
		//就说明是多出来的空格, 
		//例如:$g("      .content");这种情况不执行代码直接跳入下一循环
		var tmpValue = values[i].vtrim();
		if(tmpValue.length <= 0)
			continue;
		//内层循环为迭代每个结果节点,
		//在结果节点中查找符合选择条件的结果。当然第一次为body
		for(var j=0;j<jlength;++j)
		{
			//$findChilds就是上边的那个函数,就是选择某个节点的子节点的
			var result = $findChilds(parentNodes[j], values[i].vtrim());
			var rlength = result.length;
			//因为返回的有时候是html容器,无法直接和数组concat所以倒入数组,这里有优化空间,但暂不考虑性能先这么做
			for (var k = 0; k < rlength; ++k)
				results.push(result[k]);
		}
		//没有结果,立即返回undefined
		if(results == undefined || results.length <= 0)
			return undefined;
		//最后一次循环就直接返回结果数组,但是如果最后一个选择条件是选择id的话,那就不返回数组直接返回dom对象了
		if (i == length - 1) 
		{
			if (values[i].substr(0, 1) == "#")
				return results[0];
			return results;
		}
		parentNodes = results;
	}
}
分享到:
评论
1 楼 scottcgi 2010-08-20  
哈哈,大家都喜欢和jquery比较啊。
其实吧,我觉得jquery代码结构真是乱的要死,现在好点,但让人都让的看。
估计和他的作者是前端程序员有关系吧。后台程序员代码结构好点

相关推荐

    HTML5&CSS3网页制作:伪元素选择器.pptx

    伪元素选择器不是实际的HTML元素,而是用于添加或修改页面内容的虚拟元素。它们允许我们向元素内容的前后插入额外的文本、图像或其他内容。CSS3 中的 `:before` 和 `:after` 伪元素选择器提供了这样的功能。 1. `:...

    HTML颜色选择器

    在给定的部分代码中,我们可以看到一个简单的颜色选择器实现方式: 1. **使用`&lt;object&gt;`标签引入外部组件**:代码中的`&lt;object&gt;`标签加载了一个名为`dlgHelper`的对象,这个对象可能是用来创建颜色选择对话框的...

    js实现键盘选择html元素

    标题“js实现键盘选择html元素”揭示了一个使用JavaScript来实现在HTML页面中通过键盘导航的交互功能。在网页设计中,这种功能增强了用户体验,特别是对于那些依赖键盘操作的用户,如残障人士或习惯于使用键盘快捷键...

    HTML5选择器和伪元素----学习分享

    3. 子元素选择器:`:nth-child(n)`和`:nth-of-type(n)`,它们可以根据元素在父元素中的位置来选择元素,n可以是数字、关键词(如even或odd)或表达式。 接下来,我们讨论HTML5的伪元素。伪元素不是实际的HTML元素,...

    jquery实现颜色选择器

    **jQuery 实现颜色选择器** ...通过这个压缩包提供的资源,你可以快速地在自己的项目中实现一个功能完整且易于使用的颜色选择器。记得在实际使用时,根据项目需求对代码进行适当的调整和优化,以确保最佳的用户体验。

    利用css+javascript实现的一个日期选择器代码

    【标题】:“利用css+javascript实现的一个日期选择器代码”涉及的核心知识点主要集中在CSS样式设计和JavaScript编程上,用于创建一个交互式的日期选择组件。日期选择器是网页表单中常见的一种元素,允许用户方便地...

    HTML CSS选择器

    伪元素选择器用于选取元素的特殊部分或状态,例如元素的首行、首字母或元素处于活动状态时。 **示例:** ```css p::first-letter { color: blue; } p::first-line { text-decoration: underline; } a:hover { color...

    css的选择器

    本文介绍了CSS中多种类型的选择器,包括类与ID选择器、元素选择器、属性选择器、伪类和伪元素等。通过这些选择器,我们可以精确控制页面的布局和样式,实现复杂的设计效果。掌握这些选择器是成为优秀前端开发人员的...

    修正版 layui单选级联(省市区选择地区)选择器的实现

    本项目"修正版 layui单选级联(省市区选择地区)选择器的实现"是基于HTML的一种功能增强,尤其在用户交互体验方面进行了优化。 layui是一款优秀的前端UI框架,它提供了丰富的组件和样式,简化了网页开发的过程。在...

    HTML5+CSS3 城市选择器

    另外,CSS3的Flexbox或Grid布局可以方便地实现选择器的响应式设计,使其在不同屏幕尺寸上都能正常显示。 JQuery库在这当中起到了辅助作用,它简化了JavaScript的DOM操作,使得事件处理、元素操作和动画效果的实现...

    javascript实现的日期选择器

    `INDEX.HTM` 通常是网页的主入口文件,它可能包含引入JavaScript脚本和样式表的链接,以及用于展示日期选择器实例的HTML元素。 `QINGJIA_ADD.HTM` 这个文件名暗示了可能是关于请假申请的功能,日期选择器在这种情况...

    HTML5&CSS3网页制作:CSS基础选择器.pptx

    为了巩固所学,你可以尝试一个练习,使用上述四种不同的选择器来实现一个简单的样式效果,例如设置标题颜色、段落字体、链接样式以及一个特殊ID元素的背景色。这样可以帮助你更好地理解和应用CSS基础选择器。

    CSS选择器.pdf

    接下来是关系选择符,包括后代选择器、直接子元素选择器、相邻选择器、兄弟选择器和并列选择器。后代选择器(EF)用于选中某个元素(E)内部的所有指定元素(F),不论层级深浅。直接子元素选择器(E&gt;F)则只选中...

    JQ 子元素过滤选择器

    例如,开发者可以利用jQuery选择器来解析HTML结构,找出需要操作的部分,或者构建自动化工具时,通过选择器快速定位目标元素,实现批量操作。 在压缩包中的“demo”文件可能是相关的示例代码或测试用例,通过查看和...

    HTML5技术开发的超酷颜色选择器

    颜色选择器的静态资源如HTML、CSS和JavaScript文件可以利用这项技术实现离线使用。 4. **颜色API** - HTML5提供了color输入类型,可以创建一个颜色选择器控件,让用户以直观的方式选择颜色。不过,这个项目可能更...

    一个简单的颜色选择器控件

    如果需要在自己的项目中使用这个颜色选择器,可以按照博客作者的指导将这些文件整合到你的HTML页面中,然后通过JavaScript调用相应的函数来初始化和操作颜色选择器。通过学习和理解这个简单的颜色选择器控件,你可以...

    HTML选择器练习(餐厅)

    5. **子元素选择器**:使用`&gt;`分隔两个选择器,选择直接子元素。例如,`ul &gt; li`会选择所有直接在`ul`元素内的`li`元素。 6. **相邻兄弟选择器**:使用`+`分隔两个选择器,选择紧跟在另一个元素之后的同级元素。...

    HTML5+CSS3实现的华丽的日期选择器源码

    在这个"HTML5+CSS3实现的华丽的日期选择器源码"中,我们可以看到这两者如何协同工作,创建出极具吸引力的用户体验。 HTML5是超文本标记语言的第五个版本,它在传统HTML的基础上添加了许多新元素,如`&lt;article&gt;`、`...

    html5手机端时间选择器

    在实现HTML5手机端时间选择器时,开发者通常会利用HTML、CSS和JavaScript技术。HTML用于构建页面结构,CSS负责样式设计和布局,而JavaScript则用于添加动态功能和交互行为。时间选择器的代码可能会包含以下几个关键...

    HTML5&CSS3网页制作:关系选择器.pptx

    它的语法结构是`E &gt; F`,其中`E`是父元素选择器,`F`是子元素选择器。例如,如果我们要将所有`h1`元素内的`strong`元素设置为红色字体,可以使用以下CSS规则: ```css h1 &gt; strong { color: red; } ``` 这将确保...

Global site tag (gtag.js) - Google Analytics