browsedom

bookmarklet library

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/515147/1475403/browsedom.js

  1. var isIE = document.all && document.execCommand ? true : false;
  2. var isNS = !document.all ? true : false;
  3. var isOP = document.all && !document.execCommand ? true : false;
  4.  
  5. var objName = '';
  6. var objs = new Array();
  7. var lvls = new Array();
  8. var exprHistory = new Array();
  9. var exprHistoryIndex = -1;
  10.  
  11. function State() {
  12. this.statename = 'State 1';
  13. }
  14. function City() {
  15. this.cityname = 'City 1';
  16. }
  17. City.prototype = new State;
  18. function Street() {
  19. this.streetname = 'Street 1';
  20. }
  21. Street.prototype = new City;
  22. var universityAvenue = new Street();
  23.  
  24. function evalExpr() {
  25. objName = document.forms[0].elements['txtExpr'].value;
  26. var x = objName.split('[');
  27. lvls.length = 0;
  28. for (var i=0; i<x.length; i++)
  29. lvls = lvls.concat(x[i].split('.'));
  30. for (var i=0; i<lvls.length; i++)
  31. if (lvls[i].indexOf(']') == lvls[i].length-1)
  32. lvls[i] = lvls[i].substring(0, lvls[i].length-1);
  33. }
  34.  
  35. function getPropsString(obj) {
  36. var objAttr = new Array();
  37. /*
  38. var obj;
  39. if (eval(objName)) {
  40. obj = eval(objName);
  41. }
  42. else {
  43. alert('Could not evaluate object.');
  44. return;
  45. }
  46. */
  47. for (var elem in obj) {
  48. objAttr.push(elem);
  49. }
  50. objAttr = objAttr.sort();
  51. var s = '';
  52. for (var i=0; i<objAttr.length; i++) {
  53. try {
  54. if (typeof(obj[objAttr[i]]) == "function")
  55. s += objAttr[i] + ' = [function]\n';
  56. else
  57. s += objAttr[i] + ' = ' + obj[objAttr[i]] + '\n';
  58. }
  59. catch (e) {
  60. s += objs[i] + ' = [' + e.description + ']\n';
  61. }
  62. }
  63.  
  64. var test = function () {
  65. this.var0 = "variable 0";
  66. this.var1 = 3.14159;
  67. this.getProp = function(x) {
  68. var i = 0;
  69. for (k in this) { if( x==i++ ) return(k); }
  70. }
  71. }
  72. /*
  73. s += '\n';
  74. blabla = new test();
  75. s += blabla.getProp(2);
  76.  
  77. var i = 0;
  78. for (k in obj) {
  79. // if (x == i++)
  80. // s += k + '\n';
  81. }
  82. */
  83. return s;
  84. }
  85.  
  86. function getProps(keepForwardHistory) {
  87. if (window.opener.closed) {
  88. alert('The referring window has been closed.');
  89. return;
  90. }
  91.  
  92. var obj = null;
  93. evalExpr();
  94. try {
  95. obj = eval('window.opener.' + objName);
  96. }
  97. catch (e) {
  98. alert('Could not evaluate object.');
  99. }
  100. var slct = document.forms[0].elements['evalresult'];
  101. slct.length = 0;
  102. objs.length = 0;
  103.  
  104. if (isIE) {
  105. getElementsIE(slct, obj);
  106. }
  107. else if (isNS || isOP) {
  108. getElementsNS(slct, obj);
  109. }
  110.  
  111. updateHistory(keepForwardHistory);
  112. }
  113.  
  114. function updateHistory(keepForwardHistory) {
  115. // Navigation history
  116. if (!keepForwardHistory && exprHistory[exprHistoryIndex] != document.forms[0].elements['txtExpr'].value) {
  117. exprHistoryIndex++;
  118. exprHistory.length = exprHistoryIndex;
  119. exprHistory.push(document.forms[0].elements['txtExpr'].value);
  120. }
  121. var btnBack = document.forms[0].elements['btnBack'];
  122. var btnForward = document.forms[0].elements['btnForward'];
  123. if (exprHistoryIndex <= 0) {
  124. btnBack.disabled = true;
  125. btnBack.title = '';
  126. if (isOP)
  127. btnBack.style.color = 'gray';
  128. }
  129. else {
  130. btnBack.disabled = false;
  131. btnBack.title = exprHistory[exprHistoryIndex-1];
  132. if (isOP)
  133. btnBack.style.color = '';
  134. }
  135. if (exprHistoryIndex >= exprHistory.length - 1) {
  136. btnForward.disabled = true;
  137. btnForward.title = '';
  138. if (isOP)
  139. btnForward.style.color = 'gray';
  140. }
  141. else {
  142. btnForward.disabled = false;
  143. btnForward.title = exprHistory[exprHistoryIndex+1];
  144. if (isOP)
  145. btnForward.style.color = '';
  146. }
  147. }
  148.  
  149. function getElementsIE(slct, obj) {
  150. try {
  151. for (var elem in obj) {
  152. objs.push(elem);
  153. var newOpt = document.createElement('OPTION');
  154. slct.add(newOpt, 0); // Maintain IE4 compatibility
  155. }
  156. }
  157. catch (e) {
  158. alert('Could not evaluate object:\n' + e.description);
  159. }
  160. objs = objs.sort();
  161. for (var i=0; i<objs.length; i++) {
  162. var opt = slct[i];
  163. try {
  164. opt.name = objs[i];
  165. opt.innerText = objs[i] + ' = ' + obj[objs[i]];
  166. }
  167. catch (e) {
  168. opt.innerText = objs[i] + ' = [' + e.description + ']';
  169. }
  170. }
  171. }
  172.  
  173. function getElementsNS(slct, obj) {
  174. // We make use of the __proto__ attribute, supported by Moz and Opera 7
  175. var props = new Array();
  176. var methods = new Array();
  177. var indeterminate = new Array();
  178.  
  179. // Get # proto levels of obj
  180. var protoLevels = 0;
  181. for (var p = obj; p; p = p.__proto__) {
  182. props[protoLevels] = new Array();
  183. methods[protoLevels] = new Array();
  184. indeterminate[protoLevels] = new Array();
  185. ++protoLevels;
  186. }
  187.  
  188. for (var elem in obj) {
  189. // Get proto level of elem
  190. var protoLevel = -1;
  191. try {
  192. for (var p = obj; p && (elem in p); p = p.__proto__)
  193. ++protoLevel;
  194. }
  195. catch (e) { // "in" operator throws when param to props() is a string
  196. protoLevel = 0;
  197. }
  198.  
  199. // Put elem into appropriate category
  200. try {
  201. if ((typeof(obj[elem])) == 'function')
  202. methods[protoLevel].push(elem);
  203. else
  204. props[protoLevel].push(elem);
  205. }
  206. catch (e) {
  207. indeterminate[protoLevel].push(elem);
  208. }
  209. }
  210.  
  211. for (var i=0; i<protoLevels; i++) {
  212. var qual = '';
  213. /*
  214. if (i == 0)
  215. qual = 'User-defined ';
  216. else if (i == 1)
  217. qual = 'Native ';
  218. */
  219. /*
  220. if (i == 1)
  221. qual = 'Native ';
  222. else
  223. qual = 'User-defined ';
  224. */
  225. addArrayNS(props[i], qual + 'Properties', slct, obj);
  226. addArrayNS(methods[i], qual + 'Methods', slct, obj);
  227. addArrayNS(indeterminate[i], qual + 'Indeterminate', slct, obj);
  228. }
  229. }
  230.  
  231. function addArrayNS(arr, header, slct, obj) {
  232. if (arr.length > 0) {
  233. var newOpt = document.createElement('OPTION');
  234. newOpt.name = '(category)';
  235. newOpt.innerHTML = '-------------------- ' + header + ' --------------------';
  236. slct.appendChild(newOpt);
  237. arr = arr.sort();
  238. for (var i=0; i<arr.length; ++i) {
  239. newOpt = document.createElement('OPTION');
  240. try {
  241. newOpt.name = arr[i];
  242. if (arr[i] == 'innerHTML')
  243. newOpt.innerHTML = 'innerHTML = [Not shown]';
  244. else {
  245. var tn;
  246. if (obj[arr[i]].toString().indexOf('function ') == 1) {
  247. var fv = obj[arr[i]].toString();
  248. fv = fv.substring(0, fv.indexOf('{') + 1) + ' [...] }';
  249. tn = document.createTextNode(arr[i] + ' = ' + fv);
  250. }
  251. else
  252. tn = document.createTextNode(arr[i] + ' = ' + obj[arr[i]]);
  253. newOpt.appendChild(tn);
  254. }
  255. }
  256. catch (e) {
  257. newOpt.innerHTML = arr[i] + ' = [' + e + ']';
  258. }
  259. slct.appendChild(newOpt);
  260. }
  261. }
  262. }
  263.  
  264. function selectProp(slct) {
  265. if (slct.selectedIndex == -1)
  266. return;
  267. if (slct[slct.selectedIndex].name == '(category)')
  268. return;
  269. lvls.push(slct[slct.selectedIndex].name);
  270. showProps();
  271. }
  272.  
  273. function goUp() {
  274. if (lvls.length > 1) {
  275. lvls.length--;
  276. showProps();
  277. }
  278. }
  279.  
  280. function goBack() {
  281. if (exprHistoryIndex > 0) {
  282. exprHistoryIndex--;
  283. document.forms[0].elements['txtExpr'].value = exprHistory[exprHistoryIndex];
  284. getProps(true);
  285. }
  286. }
  287.  
  288. function goForward() {
  289. if (exprHistory.length > exprHistoryIndex - 1) {
  290. exprHistoryIndex++;
  291. document.forms[0].elements['txtExpr'].value = exprHistory[exprHistoryIndex];
  292. getProps(true);
  293. }
  294. }
  295.  
  296. function showProps() {
  297. var s = '';
  298. for (var i=0; i<lvls.length; i++) {
  299. if (!isNaN(lvls[i]))
  300. s += '['+lvls[i]+']';
  301. else {
  302. if (s != '')
  303. s += '.';
  304. s += lvls[i];
  305. }
  306. }
  307. document.forms[0].elements['txtExpr'].value = s;
  308. getProps();
  309. }
  310.  
  311. function browseTo(expr) {
  312. document.forms[0].elements['txtExpr'].value = expr;
  313. document.forms[0].elements['btnGet'].click();
  314. }
  315.  
  316. function scanCR() {
  317. if (isIE)
  318. if (event.keyCode == 13) {
  319. document.forms[0].elements['btnGet'].click();
  320. return false;
  321. }
  322. }
  323.  
  324. /////////////////////////////////////////////////////////////////////
  325.  
  326. document.writeln("\n<html>");
  327. document.writeln("<body bgcolor='#CCCCCC' style='margin:5px' leftmargin='5' rightmargin='5' topmargin='5' bottommargin='5'>");
  328. document.writeln("<form enctype='text/plain' onSubmit='return false'>");
  329. document.writeln("<table id='tblDom' cellpadding='1' cellspacing='0' border='0' width='100%' height='100%'>");
  330. document.writeln(" <tr height='1%'>");
  331. document.writeln(" <td>");
  332. document.writeln(" <table cellpadding='0' cellspacing='0' border='0' width='100%'>");
  333. document.writeln(" <tr valign='top'>");
  334. document.writeln(" <td width='96%' nowrap><input type='text' name='txtExpr' value='document' size='60' style='width:100%' onKeyDown='scanCR()'></td>");
  335. document.writeln(" <td width='1%' nowrap>&nbsp;<input type='submit' name='btnGet' value=' Get ' onClick='getProps()'></td>");
  336. document.writeln(" <td width='1%' nowrap>&nbsp;<input type='button' name='btnUp' value=' Up ' onClick='goUp()'></td>");
  337. document.writeln(" <td width='1%' nowrap>&nbsp;<input type='button' name='btnBack' value=' < ' onClick='goBack()'></td>");
  338. document.writeln(" <td width='1%' nowrap>&nbsp;<input type='button' name='btnForward' value=' > ' onClick='goForward()'></td>");
  339. document.writeln(" </tr>");
  340. document.writeln(" </table>");
  341. document.writeln(" </td>");
  342. document.writeln(" </tr>");
  343. document.writeln(" <tr valign='top' height='*'>");
  344. document.writeln(" <td><select id='evalresult' size='25' style='width:100%; height:100%' onDblClick='selectProp(this)'></select></td>");
  345. document.writeln(" </tr>");
  346. document.writeln(" <tr height='1%'>");
  347. document.writeln(" <td>");
  348. document.writeln(" Quick nav.:&nbsp;&nbsp;<a href='javascript: browseTo(\"window\")'>window</a>&nbsp;&nbsp;");
  349. document.writeln(" <a href='javascript: browseTo(\"document\")'>document</a>&nbsp;&nbsp;");
  350. document.writeln(" <a href='javascript: browseTo(\"document.body\")'>body</a>&nbsp;&nbsp;");
  351. document.writeln(" <a href='javascript: browseTo(\"window.frames\")'>frames</a>");
  352. document.writeln(" </td>");
  353. document.writeln(" </tr>");
  354. document.writeln("</table>");
  355. document.writeln("</form>");
  356.  
  357. document.writeln("<script language='JavaScript'>");
  358.  
  359. document.writeln("if (opener) {");
  360. document.writeln(" document.title = 'DOM Browser - ' + opener.document.location.href;");
  361. document.writeln(" getProps();");
  362. document.writeln("}");
  363. document.writeln("else {");
  364. document.writeln(" alert('The referring window has been closed, or you opened this page directly.\\nThis page is intended to be called from a referrer.');");
  365. document.writeln("}");
  366.  
  367. document.writeln("if (isNS) {");
  368. document.writeln(" window.onresize = handleResizeNS;");
  369. document.writeln(" handleResizeNS();");
  370. document.writeln("}");
  371. document.writeln("if (isOP) {");
  372. document.writeln(" window.onresize = handleResizeOP;");
  373. document.writeln(" handleResizeOP();");
  374. document.writeln("}");
  375.  
  376. /*
  377. For Mozilla and Opera we need to patch their style implementation.
  378.  
  379. Mozilla thinks a listbox with style='width:100%' means the listbox width must accommodate
  380. the widest element in the listbox. In fact '100%' should refer to the page width,
  381. meaning the listbox should be as wide as the page. That's how it works for textboxes.
  382.  
  383. Mozilla furthermore ignores listbox style='height:100%'.
  384.  
  385. Opera thinks a listbox with style='height:100%' means the listbox height must accommodate
  386. the total # element in the listbox. In fact '100%' should refer to the page height,
  387. meaning the listbox should be as tall as the page. An empty listbox with style='height:100%'
  388. is 1 px. high in Opera!
  389. */
  390.  
  391. document.writeln("function handleResizeNS() {");
  392. document.writeln(" document.getElementById('evalresult').style.width = document.body.offsetWidth + 'px';");
  393. document.writeln(" document.getElementById('evalresult').style.height = window.innerHeight-70 + 'px';");
  394. document.writeln("}");
  395.  
  396. document.writeln("function handleResizeOP() {");
  397. document.writeln(" document.getElementById('evalresult').style.width = document.body.offsetWidth-20 + 'px';");
  398. document.writeln(" document.getElementById('evalresult').style.height = window.innerHeight-90 + 'px';");
  399. document.writeln("}");
  400.  
  401. document.writeln("</script>");
  402.  
  403. document.writeln("</body>");
  404. document.writeln("</html>");

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址