当前位置 : 主页 > 网络编程 > JavaScript >

计算dom元素的唯一hash值

来源:互联网 收集:自由互联 发布时间:2021-06-28
计算dom元素的唯一hash值 //element hashvar ALL_TAGS = [ '!DOCTYPE', 'A', 'ABBR', 'ACRONYM', 'ADDRESS', 'APPLET', 'AREA','ARTICLE', 'ASIDE', 'AUDIO', 'B', 'BASE', 'BASEFONT', 'BDI', 'BDO','BIG', 'BLOCKQUOTE', 'BODY', 'BR', 'BUTTON', '
计算dom元素的唯一hash值
//element hash

var ALL_TAGS = [ '!DOCTYPE', 'A', 'ABBR', 'ACRONYM', 'ADDRESS', 'APPLET', 'AREA',
		'ARTICLE', 'ASIDE', 'AUDIO', 'B', 'BASE', 'BASEFONT', 'BDI', 'BDO',
		'BIG', 'BLOCKQUOTE', 'BODY', 'BR', 'BUTTON', 'CANVAS', 'CAPTION',
		'CENTER', 'CITE', 'CODE', 'COL', 'COLGROUP', 'COMMAND', 'DATALIST',
		'DD', 'DEL', 'DETAILS', 'DIR', 'DIV', 'DFN', 'DIALOG', 'DL', 'DT',
		'EM', 'EMBED', 'FIELDSET', 'FIGCAPTION', 'FIGURE', 'FONT', 'FOOTER',
		'FORM', 'FRAME', 'FRAMESET', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6',
		'HEAD', 'HEADER', 'HR', 'HTML', 'I', 'IFRAME', 'IMG', 'INPUT', 'INS',
		'KBD', 'KEYGEN', 'LABEL', 'LEGEND', 'LI', 'LINK', 'MAP', 'MARK',
		'MENU', 'MENUITEM', 'META', 'METER', 'NAV', 'NOFRAMES', 'NOSCRIPT',
		'OBJECT', 'OL', 'OPTGROUP', 'OPTION', 'OUTPUT', 'P', 'PARAM', 'PRE',
		'PROGRESS', 'Q', 'RP', 'RT', 'RUBY', 'S', 'SAMP', 'SCRIPT', 'SECTION',
		'SELECT', 'SMALL', 'SOURCE', 'SPAN', 'STRIKE', 'STRONG', 'STYLE',
		'SUB', 'SUMMARY', 'SUP', 'TABLE', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT',
		'TH', 'THEAD', 'TIME', 'TITLE', 'TR', 'TRACK', 'TT', 'U', 'UL', 'VAR',
		'VIDEO', 'WBR', 'XMP' ];

var _TAGS = [];

function hash(e) {
	if (!isDom(e)) {
		return 0;
	}

	var n = e.nodeName;
	if (-1 == _TAGS.indexOf(n)) {
		_TAGS.push(n);
	}
	
	e.hash = _TAGS.indexOf(n) + getChildrenIndex(e) + hash(e.parentElement); 

	return e.hash;
}

function isDom(e) {
	if (e == null || typeof e == 'undefined') {
		return false;
	}

	if (typeof HTMLElement === 'object') {
		return e instanceof HTMLElement;
	} else {
		return typeof e === 'object' && e.nodeType === 1
				&& typeof e.nodeName === 'string';
	}
}

function getChildrenIndex(ele) {
	// IE is simplest and fastest
	if (ele.sourceIndex) {
		return ele.sourceIndex - ele.parentNode.sourceIndex - 1;
	}
	// other browsers
	var i = 0;
	while (ele = ele.previousElementSibling) {
		i++;
	}
	return i;
}
网友评论