最近在看各种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>
?