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