chimee-helper-dom
Version:
dom hanlders of chimee
312 lines (277 loc) • 9.26 kB
JavaScript
import * as dom from 'index';
const tempEl = document.createElement('div');
/* 添加到文档用于测试选择器 */
document.body.appendChild(tempEl);
/* 属性操作 */
const attrName = 'attr';
const attrVal = 'val';
test('setAttr && getAttr', () => {
dom.setAttr(tempEl, attrName, attrVal);
expect(dom.getAttr(tempEl, attrName)).toBe(attrVal);
dom.setAttr(tempEl, attrName); // 清空
expect(dom.getAttr(tempEl, attrName)).toBe(null);
});
/* 类名操作 */
const className = 'test-cls';
const classNames = 'test-cls1 test-cls2';
test('addClassName', () => {
dom.addClassName(tempEl, className);
expect(tempEl.className).toBe(className);
dom.addClassName(tempEl, classNames);
expect(tempEl.className).toBe(className + ' ' + classNames);
});
test('hasClassName', () => {
expect(dom.hasClassName(tempEl, className)).toBe(true);
expect(dom.hasClassName(tempEl, classNames)).toBe(true);
});
test('removeClassName', () => {
dom.removeClassName(tempEl, className);
expect(dom.hasClassName(tempEl, className)).toBe(false);
dom.removeClassName(tempEl, classNames);
dom.removeClassName(tempEl); // 未传递className 啥也不干
expect(dom.hasClassName(tempEl, classNames)).toBe(false);
});
/* 事件操作 */
let evtCount = 0;
const evtHandler = () => evtCount++;
test('addEvent', () => {
evtCount = 0;
dom.addEvent(tempEl, 'click', evtHandler);
tempEl.click();
tempEl.click();
expect(evtCount).toBe(2);
});
test('removeEvent', () => {
dom.removeEvent(tempEl, 'click', evtHandler);
tempEl.click();
expect(evtCount).toBe(2);
});
test('addEvent - Once', () => {
evtCount = 0;
dom.addEvent(tempEl, 'click', evtHandler, true);
tempEl.click();
tempEl.click();
expect(evtCount).toBe(1);
dom.removeEvent(tempEl, 'click', evtHandler, true);
});
test('removeEvent - Once', () => {
evtCount = 0;
dom.addEvent(tempEl, 'click', evtHandler, true);
dom.removeEvent(tempEl, 'click', evtHandler, true);
tempEl.click();
expect(evtCount).toBe(0); // remove后evtCount不再累加保持0
});
tempEl.innerHTML = `
<a>aaa</a>
<b>bbb</b>
`;
test('addDelegate', () => {
evtCount = 0;
dom.addDelegate(tempEl, 'a', 'click', evtHandler);
const aEl = tempEl.querySelector('a');
/* 通过实例化Event实现冒泡 */
const clickEvent = new window.Event('click', { bubbles: true });
clickEvent.srcElement = aEl; // NODE环境下srcElement需要手动赋值
aEl.dispatchEvent(clickEvent);
expect(evtCount).toBe(1);
});
test('removeDelegate', () => {
evtCount = 0;
dom.removeDelegate(tempEl, 'a', 'click', evtHandler);
const aEl = tempEl.querySelector('a');
/* 通过实例化Event实现冒泡 */
const clickEvent = new window.Event('click', { bubbles: true });
clickEvent.srcElement = aEl; // NODE环境下srcElement需要手动赋值
aEl.dispatchEvent(clickEvent);
expect(evtCount).toBe(0);
});
const styleKey = 'width';
const styleVal = '1px';
test('setStyle && getStyle', () => {
dom.setStyle(tempEl, styleKey, styleVal);
expect(dom.getStyle(tempEl, styleKey)).toBe(styleVal);
dom.setStyle(tempEl, { width: '2px' });
expect(dom.getStyle(tempEl, styleKey)).toBe('2px');
});
test('query', () => {
const queryRet = dom.query('div');
expect(queryRet).toHaveLength(1);
expect(queryRet[0].tagName.toLocaleLowerCase()).toBe('div');
expect(queryRet.constructor).toBe(NodeList);
/* 强制返回Array */
expect(dom.query('div', document, true).constructor).toBe(Array);
});
test('findParents', () => {
expect(dom.findParents(tempEl)).toHaveLength(3); // body->html->document
expect(dom.findParents(tempEl, document.body)).toHaveLength(0); // 到body停止且不包含body
expect(dom.findParents(tempEl, document.body, false, true)).toHaveLength(1); // 到body停止且包含body
expect(dom.findParents(tempEl, document.body, true, true)).toHaveLength(2); // 到body停止且包含body和元素自己
});
test('removeEl', () => {
const box = document.createElement('div');
box.innerHTML = '<a>a</a>';
dom.removeEl(box.querySelector('a'));
expect(box.querySelector('a')).toBeNull();
});
const testHTML = '<a>a</a><b>b</b>';
test('$', () => {
/* HTMLElenemt */
expect(dom.$(tempEl)).toHaveLength(1);
/* selector */
const divWrap = dom.$('div');
expect(divWrap).toHaveLength(1);
/* NodeWrap */
expect(dom.$(divWrap)).toHaveLength(1);
/* selector && container */
expect(dom.$('div', document.body)).toHaveLength(1);
/* HTMLString */
expect(dom.$(testHTML)).toHaveLength(2);
/* NodeList */
expect(dom.$(document.querySelectorAll('div'))[0].tagName.toLocaleLowerCase()).toBe('div');
/* Array */
expect(dom.$([ tempEl ])[0].tagName.toLocaleLowerCase()).toBe('div');
/* 任意其他对象 */
expect(dom.$({ any: 1 })).toHaveLength(1);
});
const doms = new dom.NodeWrap(tempEl);
test('NodeWrap.each', () => {
let tag = '';
doms.each(el => { tag = el.tagName; });
expect(tag.toLocaleLowerCase()).toBe('div');
});
test('NodeWrap.push', () => {
doms.push(document);
expect(doms).toHaveLength(2);
});
test('NodeWrap.splice', () => {
doms.splice(1, 1);
expect(doms).toHaveLength(1);
expect(tempEl.tagName.toLocaleLowerCase()).toBe('div');
});
test('NodeWrap.find', () => {
const childs = doms.find('*');
expect(childs).toHaveLength(2);
expect(childs[0].tagName.toLocaleLowerCase()).toBe('a');
});
test('NodeWrap.text', () => {
doms.text(testHTML);
expect(doms.text()).toBe(testHTML);
});
test('NodeWrap.html', () => {
doms.html(testHTML);
expect(doms.html()).toBe(testHTML);
});
test('NodeWrap.attr', () => {
doms.attr(attrName, attrVal);
expect(doms.attr(attrName)).toBe(attrVal);
});
test('NodeWrap.data', () => {
doms.data(attrName, attrVal);
expect(doms.data(attrName)).toBe(attrVal);
expect(doms.data()[attrName]).toBe(attrVal);
const ndElWrap = dom.$({ tagName: 'no-dataset' });
expect(ndElWrap.data(attrName)).toBeUndefined();
expect(JSON.stringify(ndElWrap.data())).toBe('{}');
ndElWrap.data(attrName, attrVal);
expect(ndElWrap.data(attrName)).toBe(attrVal);
});
test('NodeWrap.css', () => {
doms.css(styleKey, styleVal);
expect(doms.css(styleKey)).toBe(styleVal);
doms.css({ width: '3px' });
expect(doms.css(styleKey)).toBe('3px');
});
test('NodeWrap.addClass', () => {
doms.addClass(className);
expect(tempEl.className).toBe(className);
doms.addClass(classNames);
expect(tempEl.className).toBe(className + ' ' + classNames);
});
test('NodeWrap.hasClass', () => {
expect(doms.hasClass(className)).toBe(true);
expect(doms.hasClass(classNames)).toBe(true);
});
test('NodeWrap.removeClass', () => {
doms.removeClass(className);
expect(tempEl.className).toBe(classNames);
doms.removeClass(classNames);
expect(tempEl.className).toBe('');
});
const nclElWrap = dom.$({ tagName: 'test-no-class-list' });
const nclCls = 'no-class-list cls2';
test('NodeWrap.addClass - no classList', () => {
/* 测试不支持classList的场景 */
nclElWrap.addClass(nclCls);
nclElWrap.addClass();
expect(nclElWrap[0].className).toBe(nclCls);
});
test('NodeWrap.removeClass - no classList', () => {
/* 测试不支持classList的场景 */
nclElWrap.removeClass(nclCls);
expect(nclElWrap[0].className).toBe('');
});
let _count = 0;
const clickHandler = () => _count++;
test('NodeWrap.on', () => {
_count = 0;
dom.$(tempEl).on('click', clickHandler);
tempEl.click();
tempEl.click();
expect(_count).toBe(2);
});
test('NodeWrap.un', () => {
dom.$(tempEl).off('click', clickHandler);
tempEl.click();
expect(_count).toBe(2);
});
test('NodeWrap.on - once', () => {
_count = 0;
dom.$(tempEl).on('click', clickHandler, true);
tempEl.click();
tempEl.click();
expect(_count).toBe(1);
dom.$(tempEl).off('click', clickHandler, true);
});
test('NodeWrap.un - once', () => {
dom.$(tempEl).on('click', clickHandler, true).off('click', clickHandler, true);
tempEl.click();
expect(_count).toBe(1);
});
test('NodeWrap.delegate', () => {
_count = 0;
const domWrap = dom.$(tempEl);
domWrap.delegate('a', 'click', clickHandler);
const aEl = tempEl.querySelector('a');
/* 通过实例化Event实现冒泡 */
const clickEvent = new window.Event('click', { bubbles: true });
clickEvent.srcElement = aEl; // NODE环境下srcElement需要手动赋值
aEl.dispatchEvent(clickEvent);
expect(_count).toBe(1);
});
test('NodeWrap.undelegate', () => {
_count = 0;
const domWrap = dom.$(tempEl);
domWrap.undelegate('a', 'click', clickHandler);
const aEl = tempEl.querySelector('a');
/* 通过实例化Event实现冒泡 */
const clickEvent = new window.Event('click', { bubbles: true });
clickEvent.srcElement = aEl; // NODE环境下srcElement需要手动赋值
aEl.dispatchEvent(clickEvent);
expect(_count).toBe(0);
});
test('NodeWrap.append', () => {
const domWrap = dom.$('<div>');
domWrap.append('<i>ii</i>');
expect(domWrap.find('i')).toHaveLength(1);
});
test('NodeWrap.appendTo', () => {
const child = dom.$('<h1>');
const parent = dom.$('<div>');
child.appendTo(parent);
expect(parent.find('h1')).toHaveLength(1);
});
test('NodeWrap.remove', () => {
const $box = dom.$('<div><a>a</a></div>');
$box.find('a').remove();
expect($box.find('a')).toHaveLength(0);
});