您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
bookmarklet library
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/515147/1475403/browsedom.js
- var isIE = document.all && document.execCommand ? true : false;
- var isNS = !document.all ? true : false;
- var isOP = document.all && !document.execCommand ? true : false;
- var objName = '';
- var objs = new Array();
- var lvls = new Array();
- var exprHistory = new Array();
- var exprHistoryIndex = -1;
- function State() {
- this.statename = 'State 1';
- }
- function City() {
- this.cityname = 'City 1';
- }
- City.prototype = new State;
- function Street() {
- this.streetname = 'Street 1';
- }
- Street.prototype = new City;
- var universityAvenue = new Street();
- function evalExpr() {
- objName = document.forms[0].elements['txtExpr'].value;
- var x = objName.split('[');
- lvls.length = 0;
- for (var i=0; i<x.length; i++)
- lvls = lvls.concat(x[i].split('.'));
- for (var i=0; i<lvls.length; i++)
- if (lvls[i].indexOf(']') == lvls[i].length-1)
- lvls[i] = lvls[i].substring(0, lvls[i].length-1);
- }
- function getPropsString(obj) {
- var objAttr = new Array();
- /*
- var obj;
- if (eval(objName)) {
- obj = eval(objName);
- }
- else {
- alert('Could not evaluate object.');
- return;
- }
- */
- for (var elem in obj) {
- objAttr.push(elem);
- }
- objAttr = objAttr.sort();
- var s = '';
- for (var i=0; i<objAttr.length; i++) {
- try {
- if (typeof(obj[objAttr[i]]) == "function")
- s += objAttr[i] + ' = [function]\n';
- else
- s += objAttr[i] + ' = ' + obj[objAttr[i]] + '\n';
- }
- catch (e) {
- s += objs[i] + ' = [' + e.description + ']\n';
- }
- }
- var test = function () {
- this.var0 = "variable 0";
- this.var1 = 3.14159;
- this.getProp = function(x) {
- var i = 0;
- for (k in this) { if( x==i++ ) return(k); }
- }
- }
- /*
- s += '\n';
- blabla = new test();
- s += blabla.getProp(2);
- var i = 0;
- for (k in obj) {
- // if (x == i++)
- // s += k + '\n';
- }
- */
- return s;
- }
- function getProps(keepForwardHistory) {
- if (window.opener.closed) {
- alert('The referring window has been closed.');
- return;
- }
- var obj = null;
- evalExpr();
- try {
- obj = eval('window.opener.' + objName);
- }
- catch (e) {
- alert('Could not evaluate object.');
- }
- var slct = document.forms[0].elements['evalresult'];
- slct.length = 0;
- objs.length = 0;
- if (isIE) {
- getElementsIE(slct, obj);
- }
- else if (isNS || isOP) {
- getElementsNS(slct, obj);
- }
- updateHistory(keepForwardHistory);
- }
- function updateHistory(keepForwardHistory) {
- // Navigation history
- if (!keepForwardHistory && exprHistory[exprHistoryIndex] != document.forms[0].elements['txtExpr'].value) {
- exprHistoryIndex++;
- exprHistory.length = exprHistoryIndex;
- exprHistory.push(document.forms[0].elements['txtExpr'].value);
- }
- var btnBack = document.forms[0].elements['btnBack'];
- var btnForward = document.forms[0].elements['btnForward'];
- if (exprHistoryIndex <= 0) {
- btnBack.disabled = true;
- btnBack.title = '';
- if (isOP)
- btnBack.style.color = 'gray';
- }
- else {
- btnBack.disabled = false;
- btnBack.title = exprHistory[exprHistoryIndex-1];
- if (isOP)
- btnBack.style.color = '';
- }
- if (exprHistoryIndex >= exprHistory.length - 1) {
- btnForward.disabled = true;
- btnForward.title = '';
- if (isOP)
- btnForward.style.color = 'gray';
- }
- else {
- btnForward.disabled = false;
- btnForward.title = exprHistory[exprHistoryIndex+1];
- if (isOP)
- btnForward.style.color = '';
- }
- }
- function getElementsIE(slct, obj) {
- try {
- for (var elem in obj) {
- objs.push(elem);
- var newOpt = document.createElement('OPTION');
- slct.add(newOpt, 0); // Maintain IE4 compatibility
- }
- }
- catch (e) {
- alert('Could not evaluate object:\n' + e.description);
- }
- objs = objs.sort();
- for (var i=0; i<objs.length; i++) {
- var opt = slct[i];
- try {
- opt.name = objs[i];
- opt.innerText = objs[i] + ' = ' + obj[objs[i]];
- }
- catch (e) {
- opt.innerText = objs[i] + ' = [' + e.description + ']';
- }
- }
- }
- function getElementsNS(slct, obj) {
- // We make use of the __proto__ attribute, supported by Moz and Opera 7
- var props = new Array();
- var methods = new Array();
- var indeterminate = new Array();
- // Get # proto levels of obj
- var protoLevels = 0;
- for (var p = obj; p; p = p.__proto__) {
- props[protoLevels] = new Array();
- methods[protoLevels] = new Array();
- indeterminate[protoLevels] = new Array();
- ++protoLevels;
- }
- for (var elem in obj) {
- // Get proto level of elem
- var protoLevel = -1;
- try {
- for (var p = obj; p && (elem in p); p = p.__proto__)
- ++protoLevel;
- }
- catch (e) { // "in" operator throws when param to props() is a string
- protoLevel = 0;
- }
- // Put elem into appropriate category
- try {
- if ((typeof(obj[elem])) == 'function')
- methods[protoLevel].push(elem);
- else
- props[protoLevel].push(elem);
- }
- catch (e) {
- indeterminate[protoLevel].push(elem);
- }
- }
- for (var i=0; i<protoLevels; i++) {
- var qual = '';
- /*
- if (i == 0)
- qual = 'User-defined ';
- else if (i == 1)
- qual = 'Native ';
- */
- /*
- if (i == 1)
- qual = 'Native ';
- else
- qual = 'User-defined ';
- */
- addArrayNS(props[i], qual + 'Properties', slct, obj);
- addArrayNS(methods[i], qual + 'Methods', slct, obj);
- addArrayNS(indeterminate[i], qual + 'Indeterminate', slct, obj);
- }
- }
- function addArrayNS(arr, header, slct, obj) {
- if (arr.length > 0) {
- var newOpt = document.createElement('OPTION');
- newOpt.name = '(category)';
- newOpt.innerHTML = '-------------------- ' + header + ' --------------------';
- slct.appendChild(newOpt);
- arr = arr.sort();
- for (var i=0; i<arr.length; ++i) {
- newOpt = document.createElement('OPTION');
- try {
- newOpt.name = arr[i];
- if (arr[i] == 'innerHTML')
- newOpt.innerHTML = 'innerHTML = [Not shown]';
- else {
- var tn;
- if (obj[arr[i]].toString().indexOf('function ') == 1) {
- var fv = obj[arr[i]].toString();
- fv = fv.substring(0, fv.indexOf('{') + 1) + ' [...] }';
- tn = document.createTextNode(arr[i] + ' = ' + fv);
- }
- else
- tn = document.createTextNode(arr[i] + ' = ' + obj[arr[i]]);
- newOpt.appendChild(tn);
- }
- }
- catch (e) {
- newOpt.innerHTML = arr[i] + ' = [' + e + ']';
- }
- slct.appendChild(newOpt);
- }
- }
- }
- function selectProp(slct) {
- if (slct.selectedIndex == -1)
- return;
- if (slct[slct.selectedIndex].name == '(category)')
- return;
- lvls.push(slct[slct.selectedIndex].name);
- showProps();
- }
- function goUp() {
- if (lvls.length > 1) {
- lvls.length--;
- showProps();
- }
- }
- function goBack() {
- if (exprHistoryIndex > 0) {
- exprHistoryIndex--;
- document.forms[0].elements['txtExpr'].value = exprHistory[exprHistoryIndex];
- getProps(true);
- }
- }
- function goForward() {
- if (exprHistory.length > exprHistoryIndex - 1) {
- exprHistoryIndex++;
- document.forms[0].elements['txtExpr'].value = exprHistory[exprHistoryIndex];
- getProps(true);
- }
- }
- function showProps() {
- var s = '';
- for (var i=0; i<lvls.length; i++) {
- if (!isNaN(lvls[i]))
- s += '['+lvls[i]+']';
- else {
- if (s != '')
- s += '.';
- s += lvls[i];
- }
- }
- document.forms[0].elements['txtExpr'].value = s;
- getProps();
- }
- function browseTo(expr) {
- document.forms[0].elements['txtExpr'].value = expr;
- document.forms[0].elements['btnGet'].click();
- }
- function scanCR() {
- if (isIE)
- if (event.keyCode == 13) {
- document.forms[0].elements['btnGet'].click();
- return false;
- }
- }
- /////////////////////////////////////////////////////////////////////
- document.writeln("\n<html>");
- document.writeln("<body bgcolor='#CCCCCC' style='margin:5px' leftmargin='5' rightmargin='5' topmargin='5' bottommargin='5'>");
- document.writeln("<form enctype='text/plain' onSubmit='return false'>");
- document.writeln("<table id='tblDom' cellpadding='1' cellspacing='0' border='0' width='100%' height='100%'>");
- document.writeln(" <tr height='1%'>");
- document.writeln(" <td>");
- document.writeln(" <table cellpadding='0' cellspacing='0' border='0' width='100%'>");
- document.writeln(" <tr valign='top'>");
- document.writeln(" <td width='96%' nowrap><input type='text' name='txtExpr' value='document' size='60' style='width:100%' onKeyDown='scanCR()'></td>");
- document.writeln(" <td width='1%' nowrap> <input type='submit' name='btnGet' value=' Get ' onClick='getProps()'></td>");
- document.writeln(" <td width='1%' nowrap> <input type='button' name='btnUp' value=' Up ' onClick='goUp()'></td>");
- document.writeln(" <td width='1%' nowrap> <input type='button' name='btnBack' value=' < ' onClick='goBack()'></td>");
- document.writeln(" <td width='1%' nowrap> <input type='button' name='btnForward' value=' > ' onClick='goForward()'></td>");
- document.writeln(" </tr>");
- document.writeln(" </table>");
- document.writeln(" </td>");
- document.writeln(" </tr>");
- document.writeln(" <tr valign='top' height='*'>");
- document.writeln(" <td><select id='evalresult' size='25' style='width:100%; height:100%' onDblClick='selectProp(this)'></select></td>");
- document.writeln(" </tr>");
- document.writeln(" <tr height='1%'>");
- document.writeln(" <td>");
- document.writeln(" Quick nav.: <a href='javascript: browseTo(\"window\")'>window</a> ");
- document.writeln(" <a href='javascript: browseTo(\"document\")'>document</a> ");
- document.writeln(" <a href='javascript: browseTo(\"document.body\")'>body</a> ");
- document.writeln(" <a href='javascript: browseTo(\"window.frames\")'>frames</a>");
- document.writeln(" </td>");
- document.writeln(" </tr>");
- document.writeln("</table>");
- document.writeln("</form>");
- document.writeln("<script language='JavaScript'>");
- document.writeln("if (opener) {");
- document.writeln(" document.title = 'DOM Browser - ' + opener.document.location.href;");
- document.writeln(" getProps();");
- document.writeln("}");
- document.writeln("else {");
- 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.');");
- document.writeln("}");
- document.writeln("if (isNS) {");
- document.writeln(" window.onresize = handleResizeNS;");
- document.writeln(" handleResizeNS();");
- document.writeln("}");
- document.writeln("if (isOP) {");
- document.writeln(" window.onresize = handleResizeOP;");
- document.writeln(" handleResizeOP();");
- document.writeln("}");
- /*
- For Mozilla and Opera we need to patch their style implementation.
- Mozilla thinks a listbox with style='width:100%' means the listbox width must accommodate
- the widest element in the listbox. In fact '100%' should refer to the page width,
- meaning the listbox should be as wide as the page. That's how it works for textboxes.
- Mozilla furthermore ignores listbox style='height:100%'.
- Opera thinks a listbox with style='height:100%' means the listbox height must accommodate
- the total # element in the listbox. In fact '100%' should refer to the page height,
- meaning the listbox should be as tall as the page. An empty listbox with style='height:100%'
- is 1 px. high in Opera!
- */
- document.writeln("function handleResizeNS() {");
- document.writeln(" document.getElementById('evalresult').style.width = document.body.offsetWidth + 'px';");
- document.writeln(" document.getElementById('evalresult').style.height = window.innerHeight-70 + 'px';");
- document.writeln("}");
- document.writeln("function handleResizeOP() {");
- document.writeln(" document.getElementById('evalresult').style.width = document.body.offsetWidth-20 + 'px';");
- document.writeln(" document.getElementById('evalresult').style.height = window.innerHeight-90 + 'px';");
- document.writeln("}");
- document.writeln("</script>");
- document.writeln("</body>");
- document.writeln("</html>");