计算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', '
//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;
}
