apps.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /**
  2. * Created by bjoso on 2017/5/4.
  3. */
  4. var xh = xh || {};
  5. var doc;
  6. xh.elementsShareFamily = function (primaryEl, siblingEl) {
  7. var p = primaryEl, s = siblingEl;
  8. return (p.tagName === s.tagName &&
  9. (!p.className || p.className === s.className) &&
  10. (!p.id || p.id === s.id));
  11. };
  12. //获取元素所在父节点的索引位置
  13. xh.getElementIndex = function (el) {
  14. var index = 1; // XPath索引为1
  15. var sib;
  16. for (sib = el.previousSibling; sib; sib = sib.previousSibling) {
  17. if (sib.nodeType === Node.ELEMENT_NODE && xh.elementsShareFamily(el, sib)) {
  18. index++;
  19. }
  20. }
  21. if (index > 1) {
  22. return index;
  23. }
  24. for (sib = el.nextSibling; sib; sib = sib.nextSibling) {
  25. if (sib.nodeType === Node.ELEMENT_NODE && xh.elementsShareFamily(el, sib)) {
  26. return 1;
  27. }
  28. }
  29. return 0;
  30. };
  31. var type = 0;
  32. function setType(param) {
  33. type = param;
  34. }
  35. //生成元素的xpath
  36. xh.makeQueryForElement = function (el, type) {
  37. //type表示模式,值为0时启用精准模式(id&class),否则默认为列表模式
  38. var query = '';
  39. for (; el && el.nodeType === Node.ELEMENT_NODE; el = el.parentNode) {
  40. var component = el.tagName.toLowerCase();
  41. var index = xh.getElementIndex(el);
  42. //精准模式
  43. if (type === true) {
  44. if (el.id) {
  45. component += '[@id=\'' + el.id + '\']';
  46. } else if (el.className) {
  47. component += '[@class=\'' + el.className + '\']';
  48. }
  49. if (index >= 1) {
  50. component += '[' + index + ']';
  51. }
  52. }
  53. //如果最后一个标签是img,可以选择使用img/@src.
  54. if (query === '' && el.tagName.toLowerCase() === 'img') {
  55. component += '/@src';
  56. }
  57. query = '/' + component + query;
  58. }
  59. return query;
  60. };
  61. //根据xpath查询元素
  62. xh.evaluateQuery = function (query, onclick) {
  63. var xpathResult = null;
  64. var nodeCount = 0;//元素数量
  65. var nodes = [];
  66. var toHighlight = [];
  67. var _viewNode = new Object();
  68. try {
  69. xpathResult = doc.evaluate(query, doc, null,
  70. XPathResult.ANY_TYPE, null);
  71. } catch (e) {
  72. str = '[无效的XPATH表达式]';
  73. nodeCount = 0;
  74. }
  75. if (!xpathResult) {
  76. return [str, nodeCount];
  77. }
  78. if (xpathResult.resultType === XPathResult.BOOLEAN_TYPE) {
  79. _viewNode.text = xpathResult.booleanValue ? '1' : '0';
  80. nodeCount = 1;
  81. } else if (xpathResult.resultType === XPathResult.NUMBER_TYPE) {
  82. _viewNode.text = xpathResult.numberValue.toString();
  83. nodeCount = 1;
  84. } else if (xpathResult.resultType === XPathResult.STRING_TYPE) {
  85. _viewNode.text = xpathResult.stringValue;
  86. nodeCount = 1;
  87. } else if (xpathResult.resultType === XPathResult.UNORDERED_NODE_ITERATOR_TYPE) {
  88. for (var node = xpathResult.iterateNext(); node; node = xpathResult.iterateNext()) {
  89. var viewNode = new Object();
  90. var urls = "";
  91. // var imgs = "";
  92. if (node.nodeType === Node.ELEMENT_NODE) {
  93. if (onclick === false) {
  94. toHighlight.push(node);
  95. }
  96. viewNode.text = node.textContent;
  97. //获取节点链接
  98. var _urls = node.getElementsByTagName('a');
  99. for (var i = 0; i < _urls.length; i++) {
  100. urls += _urls[i].href + '\n';
  101. }
  102. // //获取节点img
  103. // var _imgs = node.getElementsByTagName('img');
  104. // for (var i = 0; i < _imgs.length; i++) {
  105. // imgs += _imgs[i].src + '\n';
  106. // }
  107. }
  108. viewNode.urls = urls;
  109. // viewNode.imgs = imgs;
  110. nodes.push(viewNode);
  111. nodeCount++;
  112. }
  113. if (nodeCount === 0) {
  114. _viewNode.text = '[NULL]';
  115. nodes.push(_viewNode);
  116. }
  117. } else {
  118. //因为XPathResult.ANY_TYPE传递给了document.evaluate(),
  119. //应该永远不会得到上面没有处理的结果类型
  120. _viewNode.text = '[内部错误]';
  121. nodeCount = 0;
  122. }
  123. if (_viewNode) {
  124. nodes.push(_viewNode);
  125. }
  126. nodes.pop();
  127. xh.highlight(toHighlight);//高亮函数
  128. return [nodeCount, nodes];
  129. };
  130. //判断元素是否在父节点中
  131. xh.isTagXpathContains = function (xpath, subxpath) {
  132. return xpath.indexOf(subxpath) >= 0;
  133. }
  134. //获取DOM标题
  135. xh.queryTitle = function () {
  136. return doc.title
  137. }
  138. //高亮函数
  139. xh.highlight = function (els) {
  140. for (var i = 0, l = els.length; i < l; i++) {
  141. els[i].classList.add('xh-highlight');
  142. }
  143. };
  144. //清除高亮函数
  145. xh.clearHighlights = function () {
  146. var els = doc.querySelectorAll('.xh-highlight');
  147. for (var i = 0, l = els.length; i < l; i++) {
  148. els[i].classList.remove('xh-highlight');
  149. }
  150. };
  151. //禁用document中的链接跳转
  152. xh.disLink = function () {
  153. var links = doc.getElementsByTagName('a');
  154. for (var i = 0; i < links.length; i++) {
  155. links[i].classList.add('disabled');
  156. }
  157. }
  158. function docClick(e, type) {
  159. var el = e.target;
  160. if (type===0) {
  161. var xpath = xh.makeQueryForElement(el, true);
  162. var data = xh.evaluateQuery(xpath);
  163. showLook(data, xpath);
  164. } else {
  165. var xpath = xh.makeQueryForElement(el);
  166. var data = xh.evaluateQuery(xpath);
  167. showLook(data, xpath,0);
  168. }
  169. }
  170. function init(docm) {
  171. // set document
  172. doc = docm;
  173. //禁用document中的链接跳转
  174. xh.disLink();
  175. // 页面标题
  176. setFrameHtmlTitle(xh.queryTitle());
  177. //高亮
  178. doc.onmousemove = function (e) {
  179. //console.log("onmousemove");
  180. var el = e.target;
  181. var xpath = xh.makeQueryForElement(el, true);
  182. xh.evaluateQuery(xpath, false);
  183. }
  184. doc.onmouseout = function () {
  185. //console.log("onmouseout");
  186. xh.clearHighlights();
  187. }
  188. // 打开XPath页面
  189. // openXPathClick();
  190. }
  191. // window.onload = function () {
  192. //
  193. // doc = window.document;
  194. // xh.disLink();
  195. // console.log("=========函数执行标志=========");
  196. // console.log(xh.queryTitle());
  197. // document.onclick = function (e) {
  198. // var el = e.target;
  199. // var xpath = xh.makeQueryForElement(el);
  200. // console.log("列表模式xpath:", xpath);
  201. // console.log("列表模式DOM:", xh.evaluateQuery(xpath));
  202. // var xp = xh.makeQueryForElement(el, 0)
  203. // console.log("精准模式xpath:", xp);
  204. // console.log("精准模式DOM:", xh.evaluateQuery(xp));
  205. // xp = xp.replace('xh-highlight', '').replace('xh-disabled', '').replace("[@class='']", '');
  206. // console.log("原始的xpath:" + xp);
  207. // }
  208. // document.onmousemove = function (e) {
  209. // var el = e.target;
  210. // var xpath = xh.makeQueryForElement(el, 0);
  211. // xh.evaluateQuery(xpath, 0);
  212. // }
  213. // document.onmouseout = function () {
  214. // xh.clearHighlights();
  215. // }
  216. // };