87,992
社区成员
发帖
与我相关
我的任务
分享
var isSelect = function(p/* path */, r/* root */) {
//定义变量
var position = null;
var first = null;
var last = null;
var parentNode = null;
//定义正则
var queueRegExp = null;
var indexRegExp = /(\/\/|\/)(\w+|\*)(?:\[(.*?)\])?(?:\/(\.+))?/g;
var replaceRegExp = /(@|\b)(.+?)(?: ?)($|\)|\&|\|)/g;
var replaceAttrRegExp = /(\w+)(\!\=|<\=|\=>|\=|<|>)?([^$]+)?/;
var replaceNumberRegExp = /^(?:\s+)?(\d+)(?:\s+)?$/;
var replaceSymbolRegExp = /\=>|\=/g;
var replacePositionRegExp = /position/g;
var replaceFirstRegExp = /first/g;
var replaceLastRegExp = /last/g;
//定义集合
var queue = [];
var index = [];
//定义函数
var queueSelect = function(e/* element */, i/* iterative */, p/* path */) {
//判断迭代
if(index.length <= i) {
//判断路径
if(queueRegExp.test(p)) {
//定义差异路径
var _p = p.match(queueRegExp);
//定义向上索引
var _i = index.slice(-1)[0].$4.length;
//遍历迭代索引
for(var i = index.length - 1, j = e; 0 <= i; i--, j = j.parentNode) {
if(index[i].$3 && !eval(index[i].$3.replace(replaceRegExp, function($1, $2, $3, $4) {return replaceSelect(j, index[i].$2, $2, $3, $4)}))) {
return;
}
if(index[i].$1 === '//' && i > 0) {
for(var k = _p.pop().split('/').length; 0 < k; k--) {
j = j.parentNode;
}
}
}
//判断向上索引
if(_i) {
for(var i = _i; 0 < i; i--) {
e = e.parentNode;
}
for(var i = queue.length - 1; 0 <= i; i--) {
if(queue[i] === e) {
return;
}
}
}
//添加队列元素
queue.push(e);
}
}
};
var indexSelect = function(e/* element */, i/* iterative */, p/* path */) {
//参数赋值
i++;
p += '/' + e.tagName;
if(e.nodeType === 1) {
//队列选择
queueSelect(e, i, p);
//遍历元素
for(var j = e.firstChild; j; j = j.nextSibling) {
indexSelect(j, i, p);
}
}
};
var replaceSelect = function(e/* element */, t/* tag */, $1, $2, $3) {
//判断行为
if($1 === '@') {
//判断格式
if(replaceAttrRegExp.test($2)) {
//定义属性值
var _$1 = e.getAttribute(RegExp.$1);
//判断属性值
if(_$1 !== null) {
//定义比较值
var _$3 = parseFloat(RegExp.$3) || RegExp.$3;
//判断比较值
if(typeof _$3 === 'number') {
_$1 = parseFloat(_$1);
switch(RegExp.$2) {
case '=' : return (_$1 == _$3) + $3;
case '<' : return (_$1 < _$3) + $3;
case '>' : return (_$1 > _$3) + $3;
case '!=' : return (_$1 != _$3) + $3;
case '<=' : return (_$1 <= _$3) + $3;
case '=>' : return (_$1 >= _$3) + $3;
}
} else {
_$1 = _$1.toLowerCase();
switch(RegExp.$2) {
case '=' : return (_$1 == _$3 ) + $3;
case '<' : return (_$1 != _$3 && _$3.indexOf(_$1) > -1) + $3;
case '>' : return (_$1 != _$3 && _$1.indexOf(_$3) > -1) + $3;
case '!=' : return (_$1 != _$3 ) + $3;
case '<=' : return (_$1 == _$3 || _$3.indexOf(_$1) > -1) + $3;
case '=>' : return (_$1 == _$3 || _$1.indexOf(_$3) > -1) + $3;
}
}
} else {
return false + $3;
}
} else {
return false + $3;
}
} else {
//判断赋值
if(e.parentNode === parentNode) {
position++;
} else {
position = 0;
first = 0;
last = -1;
parentNode = e.parentNode;
}
//判断格式
if(replaceNumberRegExp.test($2)) {
return (RegExp.$1 == position) + $3;
} else {
//计算表达式
$2 = eval($2
.replace(
replacePositionRegExp,
position
)
.replace(
replaceFirstRegExp,
first
)
.replace(
replaceLastRegExp,
function() {
if(last < 0) {
if(e === r) {
last = 0;
} else {
for(var i = parentNode.firstChild; i; i = i.nextSibling) {
if(i.nodeType === 1 && (i.tagName.toLowerCase() === t || t === '*')) {
last++;
}
}
}
}
return last;
}
)
.replace(
replaceSymbolRegExp,
function($) {
return $ === '=' ? '==' : '>=';
}
)
);
//转换表达式
if(typeof $2 === 'number') {
$2 = $2 == position;
}
return $2 + $3;
}
}
};
//索引赋值
while(indexRegExp.test(p.toLowerCase())) {
index.push({
$1 : RegExp.$1,
$2 : RegExp.$2,
$3 : RegExp.$3,
$4 : RegExp.$4
});
queueRegExp = (queueRegExp || '') + (RegExp.$1 === '//' ? '\\/(.*?)\\/' : '\\/') + (RegExp.$2 === '*' ? '\\w+' : RegExp.$2);
}
//正则赋值
queueRegExp = new RegExp('^' + queueRegExp + '$', 'i');
//选择索引
indexSelect(r, 0, '');
//返回队列
return queue;
};
var $ = function() {
var d = new Date();
var q = isSelect('//input[@type=button && @value=测试 && position = 1]', document.body);
alert(new Date() - d);
};

