最近在看各种selector,~~
跟一个朋友【酸辣土豆丝】交流了几次,他总结了下思路,实现了一个简单清楚的selector~~
-----------
/**
author: tudou ~
**/
Selector.js
Array.prototype.each = function(f) {
if (f)
for (var i = 0; i < this.length; i++)
if (f(this[i]))
return;
};
Array.prototype.all = function(f) {
if (f)
for (var i = 0; i < this.length; i++)
if (!f(this[i]))
return false;
return true;
};
Array.prototype.contains = function(o) {
if (this.length <= 0)
return false;
for (var i = 0; i < this.length; i++)
if (this[i].toString() == o.toString())
return true;
return false;
}
var SF = {
nodeOptions: { All: 0, Id: 1, Name: 2, Class: 3, TagName: 4, Mul: 5 },
toArray: function(nodes) {
var array = new Array();
for (var i = 0; i < nodes.length; i++) array.push(nodes[i]);
return array;
},
getOption: function(nodeName) {
if (nodeName == "*")
return SF.nodeOptions.All;
if (/^#[^\s]+$/.test(nodeName))
return SF.nodeOptions.Id;
if (/^@[^\s]+$/.test(nodeName))
return SF.nodeOptions.Name;
if (/^\.[^\s]+$/.test(nodeName))
return SF.nodeOptions.Class;
if (/^[^\s]+\s+[^\s]+$/.test(nodeName))
return SF.nodeOptions.Mul;
return SF.nodeOptions.TagName;
},
getAllNodes: function(node, outArray) {
var nodes = node.childNodes;
for (var i = 0; i < nodes.length; i++) {
outArray.push(nodes[i]);
SF.getAllNodes(nodes[i], outArray);
}
},
getNodes: function(rootNode, nodeName) {
var outArray = new Array();
var option = SF.getOption(nodeName);
if (rootNode == null)
rootNode = document.documentElement;
if (option == SF.nodeOptions.Name ||
option == SF.nodeOptions.Class)
nodeName = nodeName.substr(1, nodeName.length - 1);
switch (option) {
case SF.nodeOptions.All:
SF.getAllNodes(rootNode, outArray);
break;
case SF.nodeOptions.Name:
if(document.documentElement==rootNode)
outArray=SF.toArray(document.getElementsByName(nodeName));
else
SF.toArray(document.getElementsByName(nodeName)).each(function(n){
while(n.parentNode)
if(n.parentNode==rootNode){outArray.push(n); break;}
else n=n.parentNode;
});
break;
case SF.nodeOptions.Class:
var classNodes = new Array();
SF.getAllNodes(rootNode, classNodes);
for (var i = 0; i < classNodes.length; i++)
if (new RegExp("\\b" + nodeName + "\\b").test(classNodes[i].className))
outArray.push(classNodes[i]);
break;
case SF.nodeOptions.TagName:
outArray = SF.toArray(rootNode.getElementsByTagName(nodeName));
break;
default:
throw { message: "第二项应该为多节点!" };
}
return outArray;
}
}
function $(element) {
if (typeof (element).toLowerCase() != "string")
return element;
var option = SF.getOption(element);
if (option == SF.nodeOptions.Id)
return document.getElementById(element.substr(1, element.length - 1));
if (option == SF.nodeOptions.Mul) {
var currentNode;
var rNode = $(element.match(/^[^\s]+/)[0]);
if (!rNode)
throw { message: "未找到指定节点!" };
if (rNode.length) {
if (rNode.length > 1)
throw { message: "前一项,应该为唯一节点!" };
else
currentNode = rNode[0];
}
else
currentNode = rNode;
var childName = element.match(/[^\s]+$/)[0];
return SF.getNodes(currentNode, childName);
}
return SF.getNodes(null, element);
}
test.html
<html>
<head>
<style>
input {width:40px;}
#container{background:red}
</style>
<script language ="javascript" type="text/javascript" src="Selector.js"></script>
<script language ="javascript" type="text/javascript" >
function Test()
{
var r=new Array();
r.push("#A innerHTML:\"" + $("#A").innerHTML+"\"");
r.push(".c1 count: \"" + $(".c1").length+"\"");
r.push(".c2 count: \"" + $(".c2").length+"\"");
r.push("@txt count: \"" + $("@txt").length+"\"");
r.push("A count: \"" + $("A").length+"\"");
r.push("#container中的 .c2 count: \"" + $("#container .c2").length+"\"");
r.push("#container中的 input count: \"" + $("#container input").length+"\"");
r.push("#container中的 @txt count: \"" + $("#container @txt").length+"\"");
var str="";
r.each(function(txt){str+=txt+"<br/>";});
$("#pan").innerHTML=str+"<br/><br/><br/>";
}
</script>
</head>
<body>
<a id="A" class="c1 c2" href="#">A #A .c1 .c2</a>
<div id="container">#container<br /><a id="A1" class="c2" href="#">A #A1 .c2</a><input name="txt" value="@txt" /><input name="txt" value="@txt" /></div>
<a id="A2" href="#">A #A2</a>
<a id="A3" href="#">A #A3</a>
<input name="txt" value="@txt" />
<input name="txt" value="@txt" />
<input name="txt" value="@txt" /><br />
<input type="button" onclick="Test();" value="Test"/>
<div id="pan"></div>
</body>
</html>
分享到:
相关推荐
SelectorInjection是一个强大的selector注入器。它可以给view注入selector状态,免去了大量的selecor文件。 可以根据shape来着色产生selector状态 可根据普通情况下的颜色(normalColor)来自动生成按压态的颜色 ...
Selector
在simulink上进行BusCreator和BusSelector的简单实验
一个强大的selector注入器,它可以让view自动产生selector状态,免去了你写selector的麻烦。
带圆角的selector
Flutter的file_selector插件可以帮助开发者在移动应用中方便地选择文件。 要使用file_selector插件,首先...总之,file_selector插件是Flutter中非常实用的一个插件,可以帮助开发者方便地实现文件选择功能,提高移
一个强大的selector注入器,它可以让view自动产生selector状态,免去了写selector文件的麻烦。
一个关于SocketChannel、ServerSocketChannel、Selector的综合案例
Selector 一个用于替换jQuery的微型JavaScript库,整个包只有5KB.
Android selector 完整demo
selenium css selector 定位详解
CSS Selector 生成器
代码实现drawable的selector效果,不用为每个控件写selector样式; 另外,实现圆形图片处理、圆角图片处理功能
selectorgadget插件,R语言爬取网页
java selector 测试并发.多线程并发。
Laravel开发-selector 选择器模式抽象类,用于管理用户级或运行时参数上的多态性。
前端开源库-matches-selector匹配选择器,检查一个DOM元素是否匹配一个给定的选择器,并提供适当的浏览器支持和单元测试。
开发过程中使用阿里巴巴的iconfont来减小apk大小,这是做的一个Demo,里面可以用来实现selector的状态改变,非常好用的,希望对感兴趣的朋友有帮助。
Contact Selector在infopath中的使用!
Android selector demo例子 文章:http://blog.csdn.net/u012524598/article/details/21410711