image2d
Version:
🍇 使用ECMAScript绘制二维图片。Drawing Two-Dimensional Pictures Using ECMAScript.
114 lines (97 loc) • 4.05 kB
JavaScript
import { REGEXP } from './config';
import toNode from './to-node';
import image2D from '../library/core';
import { isFunction, isString, isElement } from '@hai2007/tool/type';
/**
* 在指定上下文查找结点
* @param {string|dom|array|function|image2D} selector 选择器,必输
* @param {dom|'html'|'svg'} context 查找上下文,或标签类型,必输
* @return {array|image2D} 结点数组
*
* 特别注意:
* 1.id选择器或者传入的是维护的结点,查找上下文会被忽略
* 2.如果selector传入的是一个字符串模板,context可选,其表示模板类型
*/
export default function (selector, context) {
// 如果是字符串
// context如果是字符串(应该是'html'或'svg')表示这是生成结点,也走这条路线
if (isString(context) || isString(selector)) {
selector = selector.trim().replace(new RegExp(REGEXP.blank, 'g'), '');
// 如果以'<'开头表示是字符串模板
if (typeof context == 'string' || /^</.test(selector)) {
let node = toNode(selector, context);
if (isElement(node)) return [node];
else return [];
}
// *表示查找全部
else if (selector === '*') {
return context.getElementsByTagName('*');
}
let id = selector.match(new RegExp('#' + REGEXP.identifier, 'g'));
// ID选择器
// 此选择器会忽略上下文
if (id) {
let node = document.getElementById(id[0].replace('#', ''));
if (isElement(node)) return [node];
else return [];
}
let cls = selector.match(new RegExp('\\.' + REGEXP.identifier, 'g')),
tag = selector.match(new RegExp('^' + REGEXP.identifier));
// 结点和class混合选择器
if (tag || cls) {
let allNodes = context.getElementsByTagName(tag ? tag[0] : "*"), temp = [];
for (let i = 0; i < allNodes.length; i++) {
let clazz = " " + allNodes[i].getAttribute('class') + " ", flag = true;
for (let j = 0; cls && j < cls.length; j++) {
if (!clazz.match(" " + (cls[j].replace('.', '')) + " ")) {
flag = false;
break;
}
}
if (flag) temp.push(allNodes[i]);
}
return temp;
}
// 未知情况,报错
else {
throw new Error('Unsupported selector:' + selector);
}
}
// 如果是结点
else if (isElement(selector)) {
return [selector];
}
// 如果是数组
// 数组中的内容如果不是结点会直接被忽略
else if (selector && (selector.constructor === Array || selector.constructor === HTMLCollection || selector.constructor === NodeList)) {
let temp = [];
for (let i = 0; i < selector.length; i++) {
// 如果是结点
if (isElement(selector[i])) temp.push(selector[i]);
// 如果是image2D对象
else if (selector[i] && selector[i].constructor === image2D) {
for (let j = 0; j < selector[i].length; j++) {
temp.push(selector[i][j]);
}
}
}
return temp;
}
// 如果是image2D对象
else if (selector && selector.constructor === image2D) {
return selector;
}
// 如果是函数
else if (isFunction(selector)) {
let allNodes = context.getElementsByTagName('*'), temp = [];
for (let i = 0; i < allNodes.length; i++) {
// 如果选择器函数返回true,表示当前面对的结点被接受
if (selector(allNodes[i])) temp.push(allNodes[i]);
}
return temp;
}
// 未知情况,报错
else {
throw new Error('Unknown selector:' + selector);
}
};