JAVASCRIPT   10

selector.js

Guest on 25th July 2021 04:22:12 PM

  1.  
  2. function _contains(nodeA, nodeB) {
  3.         // Bypass comparison on document node since
  4.         // we don't deal with cross frame,
  5.         // e.g. document.body.parentNode.parentNode == document (false for IE).
  6.         if (nodeA.nodeType == 9 && nodeB.nodeType != 9) {
  7.                 return true;
  8.         }
  9.         while ((nodeB = nodeB.parentNode)) {
  10.                 if (nodeB == nodeA) {
  11.                         return true;
  12.                 }
  13.         }
  14.         return false;
  15. }
  16.  
  17. var _getSetAttrDiv = document.createElement('div');
  18. _getSetAttrDiv.setAttribute('className', 't');
  19. var _GET_SET_ATTRIBUTE = _getSetAttrDiv.className !== 't';
  20.  
  21. function _getAttr(el, key) {
  22.         key = key.toLowerCase();
  23.         var val = null;
  24.         // IE6,IE7,IE=EmulateIE7
  25.         if (!_GET_SET_ATTRIBUTE && el.nodeName.toLowerCase() != 'script') {
  26.                 var div = el.ownerDocument.createElement('div');
  27.                 div.appendChild(el.cloneNode(false));
  28.                 var list = _getAttrList(_unescape(div.innerHTML));
  29.                 if (key in list) {
  30.                         val = list[key];
  31.                 }
  32.         } else {
  33.                 // IE8设置<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />,抛出异常
  34. 抛出异常
  35.                 try {
  36.                         val = el.getAttribute(key, 2);
  37.                 } catch(e) {
  38.                         val = el.getAttribute(key, 1);
  39.                 }
  40.         }
  41.         if (key === 'style' && val !== null) {
  42.                 val = _formatCss(val);
  43.         }
  44.         return val;
  45. }
  46.  
  47. function _queryAll(expr, root) {
  48.         var exprList = expr.split(',');
  49.         if (exprList.length > 1) {
  50.                 var mergedResults = [];
  51.                 _each(exprList, function() {
  52.                         _each(_queryAll(this, root), function() {
  53.                                 if (_inArray(this, mergedResults) < 0) {
  54.                                         mergedResults.push(this);
  55.                                 }
  56.                         });
  57.                 });
  58.                 return mergedResults;
  59.         }
  60.         root = root || document;
  61.         function escape(str) {
  62.                 if (typeof str != 'string') {
  63.                         return str;
  64.                 }
  65.                 return str.replace('\\$1');
  66.         }
  67. , '\\$1');
  68.         }
  69.         function stripslashes(str) {
  70.                 return str.replace(
  71.         fun, '');
  72.         }
  73.         function cmpTag(tagA, tagB) {
  74.                 return tagA === '*' || tagA.toLowerCase() === escape(tagB.toLowerCase());
  75.         }
  76.         function byId(id, tag, root) {
  77.                 var arr = [],
  78.                         doc = root.ownerDocument || root,
  79.                         el = doc.getElementById(stripslashes(id));
  80.                 if (el) {
  81.                         if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
  82.                                 arr.push(el);
  83.                         }
  84.                 }
  85.                 return arr;
  86.         }
  87.         function byClass(className, tag, root) {
  88.                 var doc = root.ownerDocument || root, arr = [], els, i, len, el;
  89.                 if (root.getElementsByClassName) {
  90.                         els = root.getElementsByClassName(stripslashes(className));
  91.                         for (i = 0, len = els.length; i < len; i++) {
  92.                                 el = els[i];
  93.                                 if (cmpTag(tag, el.nodeName)) {
  94.                                         arr.push(el);
  95.                                 }
  96.                         }
  97.                 } else if (doc.querySelectorAll) {
  98.                         els = doc.querySelectorAll((root.nodeName !== '#document' ? root.nodeName + ' ' : ' + className);
  99.                         for (i = 0, len = els.length; i < len; i++) {
  100.                                 el = els[i];
  101.                                 if (_contains(root, el)) {
  102.                                         arr.push(el);
  103.                                 }
  104.                         }
  105.                 } else {
  106.                         els = root.getElementsByTagName(tag);
  107.                         className = '   className = ' ' + className + ' ';
  108.                         for (i = 0, len = els.length; i < len; i++) {
  109.                                 el = els[i];
  110.                                 if (el.nodeType == 1) {
  111.                                         var cls = el.className;
  112.                                         if (cls && (').indexOf(className) > -1) {
  113.                                                 arr.push(el);
  114.                                         }
  115.                                 }
  116.                         }
  117.                 }
  118.                 return arr;
  119.         }
  120.         function byName(name, tag, root) {
  121.                 var arr = [], doc = root.ownerDocument || root,
  122.                         els = doc.getElementsByName(stripslashes(name)), el;
  123.                 for (var i = 0, len = els.length; i < len; i++) {
  124.                         el = els[i];
  125.                         if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
  126.                                 if (el.getAttribute('getAttribute('name') !== null) {
  127.                                         arr.push(el);
  128.                                 }
  129.                         }
  130.                 }
  131.                 return arr;
  132.         }
  133.         function byAttr(key, val, tag, root) {
  134.                 var arr = [], els = root.getElementsByTagName(tag), el;
  135.                 for (var i = 0, len = els.length; i < len; i++) {
  136.                         el = els[i];
  137.                         if (el.nodeType == 1) {
  138.                                 if (val === null) {
  139.                                         if (_getAttr(el, key) !== null) {
  140.                                                 arr.push(el);
  141.                                         }
  142.                                 } else {
  143.                                         if (val === escape(_getAttr(el, key))) {
  144.                                                 arr.push(el);
  145.                                         }
  146.                                 }
  147.                         }
  148.                 }
  149.                 return arr;
  150.         }
  151.         function select(expr, root) {
  152.                 var arr = [], matches;
  153.                 matches = \s\[<>])+)/.exec(expr);
  154.         .exec(expr);
  155.                 var tag = matches ? matches[1] : '*';
  156.                 if ((matches = \.)+)$/.exec(expr))) .exec(expr))) {
  157.                         arr = byId(matches[1], tag, root);
  158.                 } else if ((matches = \\.)+)$/.exec(expr))) .exec(expr))) {
  159.                         arr = byClass(matches[1], tag, root);
  160.                 } else if ((matches = \\.)+)\]/.exec(expr))) .exec(expr))) {
  161.                         arr = byAttr(matches[1].toLowerCase(), null, tag, root);
  162.                 } else if ((matches = \\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(expr))) .exec(expr))) {
  163.                         var key = matches[1].toLowerCase(), val = matches[2];
  164.                         if (key === 'id') {
  165.                                 arr = byId(val, tag, root);
  166.                         } else if (key === 'class') {
  167.                                 arr = byClass(val, tag, root);
  168.                         } else if (key === 'name') {
  169.                                 arr = byName(val, tag, root);
  170.                         } else {
  171.                                 arr = byAttr(key, val, tag, root);
  172.                         }
  173.                 } else {
  174.                         var els = root.getElementsByTagName(tag), el;
  175.                         for (var i = 0, len = els.length; i < len; i++) {
  176.                                 el = els[i];
  177.                                 if (el.nodeType == 1) {
  178.                                         arr.push(el);
  179.                                 }
  180.                         }
  181.                 }
  182.                 return arr;
  183.         }
  184.         var parts = [], arr, re = ])+|[\s>])/g;
  185.         while ((arr;
  186.         while ((arr = re.exec(expr))) {
  187.                 if (arr[1] !== ' ') {
  188.                         parts.push(arr[1]);
  189.                 }
  190.         }
  191.         var results = [];
  192.         if (parts.length == 1) {
  193.                 return select(parts[0], root);
  194.         }
  195.         var isChild = false, part, els, subResults, val, v, i, j, k, length, len, l;
  196.         for (i = 0, lenth = parts.length; i < lenth; i++) {
  197.                 part = parts[i];
  198.                 if (part === '>') {
  199.                         isChild = true;
  200.                         continue;
  201.                 }
  202.                 if (i > 0) {
  203.                         els = [];
  204.                         for (j = 0, len = results.length; j < len; j++) {
  205.                                 val = results[j];
  206.                                 subResults = select(part, val);
  207.                                 for (k = 0, l = subResults.length; k < l; k++) {
  208.                                         v = subResults[k];
  209.                                         if (isChild) {
  210.                                                 if (val === v.parentNode) {
  211.                                                         els.push(v);
  212.                                                 }
  213.                                         } else {
  214.                                                 els.push(v);
  215.                                         }
  216.                                 }
  217.                         }
  218.                         results = els;
  219.                 } else {
  220.                         results = select(part, root);
  221.                 }
  222.                 if (results.length === 0) {
  223.                         return [];
  224.                 }
  225.         }
  226.         return results;
  227. }
  228.  
  229. function _query(expr, root) {
  230.         var arr = _queryAll(expr, root);
  231.         return arr.length > 0 ? arr[0] : null;
  232. }
  233.  
  234. K.query = _query;
  235. K.queryAl

Raw Paste


Login or Register to edit or fork this paste. It's free.