updated 添加target参数,更新Demo
This commit is contained in:
@@ -1,95 +0,0 @@
|
||||
if (typeof Array.prototype.indexOf != "function") {
|
||||
Array.prototype.indexOf = function (searchElement, fromIndex) {
|
||||
var index = -1;
|
||||
fromIndex = fromIndex * 1 || 0;
|
||||
for (var k = 0, length = this.length; k < length; k++) {
|
||||
if (k >= fromIndex && this[k] === searchElement) {
|
||||
index = k;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
};
|
||||
}
|
||||
|
||||
if(!String.prototype.trim) {
|
||||
String.prototype.trim = function () {
|
||||
return this.replace(/^\s+|\s+$/g,'');
|
||||
};
|
||||
}
|
||||
|
||||
//跨浏览器DOM对象
|
||||
var DOMUtil = {
|
||||
getStyle:function(node,attr){
|
||||
return node.currentStyle ? node.currentStyle[attr] : getComputedStyle(node,0)[attr];
|
||||
},
|
||||
getScroll:function(){ //获取滚动条的滚动距离
|
||||
var scrollPos={};
|
||||
if (window.pageYOffset||window.pageXOffset) {
|
||||
scrollPos['top'] = window.pageYOffset;
|
||||
scrollPos['left'] = window.pageXOffset;
|
||||
}else if (document.compatMode && document.compatMode != 'BackCompat'){
|
||||
scrollPos['top'] = document.documentElement.scrollTop;
|
||||
scrollPos['left'] = document.documentElement.scrollLeft;
|
||||
}else if(document.body){
|
||||
scrollPos['top'] = document.body.scrollTop;
|
||||
scrollPos['left'] = document.body.scrollLeft;
|
||||
}
|
||||
return scrollPos;
|
||||
},
|
||||
getClient:function(){ //获取浏览器的可视区域位置
|
||||
var l,t,w,h;
|
||||
l = document.documentElement.scrollLeft || document.body.scrollLeft;
|
||||
t = document.documentElement.scrollTop || document.body.scrollTop;
|
||||
w = document.documentElement.clientWidth;
|
||||
h = document.documentElement.clientHeight;
|
||||
return {'left':l,'top':t,'width':w,'height':h} ;
|
||||
},
|
||||
getNextElement:function(node){ //获取下一个节点
|
||||
if(node.nextElementSibling){
|
||||
return node.nextElementSibling;
|
||||
}else{
|
||||
var NextElementNode = node.nextSibling;
|
||||
while(NextElementNode.nodeValue != null){
|
||||
NextElementNode = NextElementNode.nextSibling
|
||||
}
|
||||
return NextElementNode;
|
||||
}
|
||||
},
|
||||
getElementById:function(idName){
|
||||
return document.getElementById(idName);
|
||||
},
|
||||
getElementsByClassName:function(className,context,tagName){ //根据class获取节点
|
||||
if(typeof context == 'string'){
|
||||
tagName = context;
|
||||
context = document;
|
||||
}else{
|
||||
context = context || document;
|
||||
tagName = tagName || '*';
|
||||
}
|
||||
if(context.getElementsByClassName){
|
||||
return context.getElementsByClassName(className);
|
||||
}
|
||||
var nodes = context.getElementsByTagName(tagName);
|
||||
var results= [];
|
||||
for (var i = 0; i < nodes.length; i++) {
|
||||
var node = nodes[i];
|
||||
var classNames = node.className.split(' ');
|
||||
for (var j = 0; j < classNames.length; j++) {
|
||||
if (classNames[j] == className) {
|
||||
results.push(node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return results;
|
||||
},
|
||||
addClass:function(node,classname){ //对节点增加class
|
||||
if(!new RegExp("(^|\s+)"+classname).test(node.className)){
|
||||
node.className = (node.className+" "+classname).replace(/^\s+|\s+$/g,'');
|
||||
}
|
||||
},
|
||||
removeClass:function(node,classname){ //对节点删除class
|
||||
node.className = (node.className.replace(classname,"")).replace(/^\s+|\s+$/g,'');
|
||||
}
|
||||
};
|
||||
@@ -610,7 +610,7 @@
|
||||
'f,m,m,xs,d,d':['再从母姑母'],
|
||||
'f,m,m,xs,d,d,h':['再从母姑父'],
|
||||
// 舅表*
|
||||
'f,m,xb':['舅公','舅祖父','舅老爷','舅爷爷','舅爷','舅祖','舅奶爷','太舅父','x舅公'],
|
||||
'f,m,xb':['舅公','舅祖父','舅老爷','舅爷爷','舅爷','舅祖','舅奶爷','太舅父','x舅老爷','x舅公'],
|
||||
'f,m,xb,w':['舅婆','舅祖母','舅奶奶','舅奶','妗婆','太舅母'],
|
||||
// 舅表叔表
|
||||
'f,m,xb,s&o':['舅表伯父','表伯父','表伯'],
|
||||
@@ -1438,6 +1438,8 @@
|
||||
'ob':['哥哥','哥','兄','阿哥','大佬','老哥','兄长','胞哥','大哥','x哥'],
|
||||
'ob,w':['嫂子','嫂','嫂嫂','阿嫂','兄嫂','大嫂','x嫂'],
|
||||
'ob,w,f':['兄姻父','兄眷父','姻父'],
|
||||
'ob,w,f,f':['兄姻公'],
|
||||
'ob,w,f,m':['兄姻婆'],
|
||||
'ob,w,m':['兄姻母','兄眷母','姻母'],
|
||||
'ob,w,ob':['兄姻兄','兄眷兄','姻兄'],
|
||||
'ob,w,ob,w':['兄姻兄妇','兄眷兄妇'],
|
||||
@@ -1453,8 +1455,10 @@
|
||||
'ob,w,xs,d':['兄姻甥女','兄眷甥女'],
|
||||
'lb':['弟弟','弟','细佬','胞弟','老弟','x弟'],
|
||||
'lb,w':['弟妹','弟媳','弟媳妇','弟妇','x弟妹'],
|
||||
'lb,w,f':['弟姻父','姻父'],
|
||||
'lb,w,m':['弟姻母','姻母'],
|
||||
'lb,w,f':['弟姻父','弟眷母','姻父'],
|
||||
'lb,w,f,f':['弟姻公'],
|
||||
'lb,w,f,m':['弟姻婆'],
|
||||
'lb,w,m':['弟姻母','弟眷母','姻母'],
|
||||
'lb,w,ob':['弟姻兄','弟眷兄','姻兄'],
|
||||
'lb,w,ob,w':['弟姻兄妇','弟眷兄妇'],
|
||||
'lb,w,lb':['弟姻弟','弟眷弟','姻弟'],
|
||||
@@ -1468,10 +1472,10 @@
|
||||
'lb,w,xs,s':['弟姻甥男','弟眷甥男'],
|
||||
'lb,w,xs,d':['弟姻甥女','弟眷甥女'],
|
||||
'xb':['兄弟'],
|
||||
'xb,w,f':['姻伯父','姻世伯'],
|
||||
'xb,w,f,f':['姻伯公'],
|
||||
'xb,w,f,m':['姻伯婆'],
|
||||
'xb,w,m':['姻伯母'],
|
||||
'xb,w,f,ob':['姻伯父'],
|
||||
'xb,w,f,ob,w':['姻伯母'],
|
||||
'xb,w,f,lb':['姻叔父'],
|
||||
'xb,w,f,lb,w':['姻叔母'],
|
||||
'0,xb,w,xb,s':['舅眷舅男'],
|
||||
'1,xb,w,xb,s':['叔眷舅男'],
|
||||
'0,xb,w,xb,d':['舅眷舅女'],
|
||||
@@ -1558,10 +1562,10 @@
|
||||
'ls,h,xs,s':['妹姻侄男'],
|
||||
'ls,h,xs,d':['妹姻侄女'],
|
||||
'xs':['姐妹','姊妹'],
|
||||
'xs,h,f':['姻伯父','姻世伯'],
|
||||
'xs,h,f,f':['姻伯公'],
|
||||
'xs,h,f,m':['姻伯婆'],
|
||||
'xs,h,m':['姻伯母'],
|
||||
'xs,h,f,ob':['姻伯父'],
|
||||
'xs,h,f,ob,w':['姻伯母'],
|
||||
'xs,h,f,lb':['姻叔父'],
|
||||
'xs,h,f,lb,w':['姻叔母'],
|
||||
'0,xs,h,xb,s':['姨姻叔男'],
|
||||
'1,xs,h,xb,s':['姑姻叔男'],
|
||||
'0,xs,h,xb,d':['姨姻叔女'],
|
||||
@@ -1767,17 +1771,26 @@
|
||||
'd,h,xs,d':['女息姻外孙女','息姻外孙女'],
|
||||
};
|
||||
|
||||
//数组去重
|
||||
// 数组去重
|
||||
var unique = function(arr) {
|
||||
var result = [], hash = {};
|
||||
var item;
|
||||
for (var i = 0; (item = arr[i]) != null; i++) {
|
||||
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''); //对特殊语法标识相互包含的行为去重
|
||||
if (!hash[item]&&!hash[temp]){
|
||||
result.push(item);
|
||||
if (temp==item&&!hash[temp]){
|
||||
hash[item] = true;
|
||||
}
|
||||
}
|
||||
for (var i = 0; (item = arr[i]) != null; i++) {
|
||||
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''); //对特殊语法标识相互包含的行为去重
|
||||
if (temp!=item){
|
||||
if(!hash[temp]){
|
||||
result.push(item);
|
||||
}
|
||||
}else{
|
||||
result.push(item);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
@@ -1820,7 +1833,7 @@
|
||||
return match?result:[];
|
||||
}
|
||||
|
||||
// 简化选择器
|
||||
// 选择器转ID
|
||||
function selector2id(selector,sex){
|
||||
var result = [];
|
||||
var hash = {};
|
||||
@@ -1872,7 +1885,7 @@
|
||||
return unique(result);
|
||||
}
|
||||
|
||||
//获取数据
|
||||
// 通过ID获取数据
|
||||
function getDataById(id){
|
||||
var items = [];
|
||||
var getData = function(d){
|
||||
@@ -1918,7 +1931,7 @@
|
||||
return items;
|
||||
}
|
||||
|
||||
//逆转ID
|
||||
// 逆转ID
|
||||
function reverseId(id,sex){
|
||||
var hash = {
|
||||
f:['d','s'],
|
||||
@@ -1956,7 +1969,7 @@
|
||||
return '';
|
||||
}
|
||||
|
||||
//获取关系链条
|
||||
// 通过ID获取关系链条
|
||||
function getChainById(id){
|
||||
var arr = id.split(',');
|
||||
var items = [];
|
||||
@@ -1967,45 +1980,93 @@
|
||||
return items.join('的');
|
||||
}
|
||||
|
||||
// 合并选择器,查找两个对象之间的关系
|
||||
function mergeSelector(from,to){
|
||||
var Index = 0;
|
||||
var from_arr = from.split(',');
|
||||
var to_arr = to.split(',');
|
||||
for(var i=0;i<from_arr.length&&i<to_arr.length;i++){
|
||||
if(from_arr[i]!=to_arr[i]){
|
||||
break;
|
||||
}
|
||||
}
|
||||
var mid_sex = 0;
|
||||
if(to_arr[i-1].match(/([fhs1](&[ol])?|[olx]b)$/)){
|
||||
mid_sex=1;
|
||||
}
|
||||
var sex = -1;
|
||||
if(to){
|
||||
if(to.match(/,([fhs1](&[ol])?|[olx]b)$/)){
|
||||
sex=1;
|
||||
}else{
|
||||
sex=0;
|
||||
}
|
||||
}
|
||||
if(i){
|
||||
var from_sub = from_arr.slice(i).join(',');
|
||||
var to_sub = to_arr.slice(i).join(',');
|
||||
return {
|
||||
'selector':(to_sub?','+reverseId(to_sub,mid_sex):'')+(from_sub?','+from_sub:''),
|
||||
'sex':sex
|
||||
};
|
||||
}else{
|
||||
return {
|
||||
'selector':from,
|
||||
'sex':sex
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return (function (parameter){
|
||||
var options = Object.assign({
|
||||
text:'',
|
||||
target:'',
|
||||
sex:-1,
|
||||
type:'default', //为'chain'时,reverse无效
|
||||
reverse:false
|
||||
},parameter);
|
||||
var selectors = getSelectors(options.text);
|
||||
// console.log('[selectors]',selectors);
|
||||
var sex = options.sex;
|
||||
var from_selectors = getSelectors(options.text);
|
||||
var to_selectors = options.target?getSelectors(options.target):[''];
|
||||
// console.log('[selectors]',from_selectors,to_selectors);
|
||||
var result = []; //匹配结果
|
||||
for(var i = 0;i<selectors.length;i++){ //遍历所有可能性
|
||||
var ids = selector2id(selectors[i],options.sex);
|
||||
// console.log('[ids]',ids);
|
||||
for(var j=0;j<ids.length;j++){
|
||||
var id = ids[j];
|
||||
if(options.type=='chain'){
|
||||
var item = getChainById(id);
|
||||
if(item){
|
||||
result.push(item);
|
||||
}
|
||||
}else{
|
||||
if(options.reverse){
|
||||
id = reverseId(id,options.sex);
|
||||
}
|
||||
var items = getDataById(options.sex+','+id);
|
||||
if(!items.length){
|
||||
items = getDataById(id);
|
||||
}
|
||||
if(!items.length){
|
||||
if(id.indexOf('w')==0||id.indexOf('h')==0){ //找不到关系,随爱人叫
|
||||
items = getDataById(id.substr(2));
|
||||
from_selectors.forEach(function(from){
|
||||
to_selectors.forEach(function(to){
|
||||
var data = mergeSelector(from,to);
|
||||
// console.log('#data#',data);
|
||||
sex = data['sex']>-1?data['sex']:options.sex;
|
||||
var ids = selector2id(data['selector'],sex);
|
||||
// console.log('[ids]',ids);
|
||||
for(var j=0;j<ids.length;j++){
|
||||
var id = ids[j];
|
||||
if(options.type=='chain'){
|
||||
if(options.reverse){
|
||||
id = reverseId(id,sex);
|
||||
}
|
||||
var item = getChainById(id);
|
||||
if(item){
|
||||
result.push(item);
|
||||
}
|
||||
}else{
|
||||
if(options.reverse){
|
||||
id = reverseId(id,sex);
|
||||
}
|
||||
var items = getDataById(sex+','+id);
|
||||
if(!items.length){
|
||||
items = getDataById(id);
|
||||
}
|
||||
if(!items.length){
|
||||
if(id.indexOf('w')==0||id.indexOf('h')==0){ //找不到关系,随爱人叫
|
||||
items = getDataById(id.substr(2));
|
||||
}
|
||||
}
|
||||
if(items.length){
|
||||
result = result.concat(items);
|
||||
}
|
||||
}
|
||||
if(items.length){
|
||||
result = result.concat(items);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
return unique(result);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user