Source code for bookmarklet Miscellaneous Page Stats.
javascript:
(function(){
function travTree(node, ifun)
{
var counter = 0;
function ns(nxi, level)
{
var nx = nxi;
while (nx)
{
++counter;
ifun(nx);
ns(nx.firstChild, level + 1);
nx = level > 0 ? nx.nextSibling : null;
}
}
ns( node, 0 );
return counter;
}
function countItems(a)
{
return a.length;
}
function hasAttribute(e, a)
{
return e.hasAttribute(a);
}
var rp = 0;
function testEvents(n, events)
{
var ct = 0;
for (var ii = 0; ii < events.length; ++ii) {
ct += hasAttribute( n, "ON" + events[ii] ) ? 1 : 0;
}
return ct;
}
var hcRE = /\S+/;
var link_count = 0;
var script_href_count = 0;
var dummy_href_count = 0;
var scripts = [];
var inline_script_count = 0;
var refresh_count = 0;
var font_count = 0;
var layer_count = 0;
var iframe_count = 0;
var target_count = 0;
var m_events = ["CLICK", "DBLCLICK", "MOUSEDOWN", "MOUSEUP",
"MOUSEOVER", "MOUSEMOVE", "MOUSEOUT"];
var m_event_count = 0;
var k_events = ["KEYPRESS", "KEYDOWN", "KEYUP"];
var k_event_count = 0;
var f_events = ["CHANGE", "SELECT", "SUBMIT", "RESET"];
var f_event_count = 0;
var o_events = ["BLUR", "FOCUS"];
var o_event_count = 0;
function eN(n)
{
if (n.data != null && /\S+/m.test(n.data)) {
if ( n.parentNode != null ) {
switch (n.parentNode.tagName)
{
case "SCRIPT":
++inline_script_count;
break;
}
}
}
var tg = n.tagName;
if (tg == null) {return;}
if (n.attributes.length > 0) {
m_event_count += testEvents(n, m_events);
k_event_count += testEvents(n, k_events);
f_event_count += testEvents(n, f_events);
o_event_count += testEvents(n, o_events);
}
switch (tg)
{
case "SCRIPT":
if (n.src && n.src.length > 0) {
scripts[n.src] = n.src;
}
break;
case "META":
refresh_count += (n.httpEquiv.toLowerCase() == "refresh" ? 1 : 0);
break;
case "FONT":
++font_count;
break;
case "LAYER":
++layer_count;
break;
case "A":
{
if ( n.href && n.href.length > 0 ) {
dummy_href_count += (/#$/i.test(n.href) ? 1 : 0);
script_href_count += (/^javascript:/i.test(n.href) ? 1 : 0);
target_count += (hasAttribute(n, "TARGET") ? 1 : 0);
++link_count;
}
}
break;
case "IFRAME":
++iframe_count;
break;
}
}
var g_frame_count = 0;
function eD(dt, f) {
if (f != null) {
++g_frame_count;
}
var hd = dt.getElementsByTagName( "HEAD" )[0];
travTree(hd, eN);
var bod = dt.getElementsByTagName( "BODY" )[0];
travTree(bod, eN);
}
// "dIr" == "documentIterator"
function dIr(dt, f) {
function ifsr( fs )
{
for (var i = 0; i < fs.length; ++i)
{
try {
dIr(fs[i].contentDocument, fs[i]); // recursive call
}
catch (e) {
alert(e || "Unspecified error");
}
}
}
if (dt == null) {return;}
eD(dt, f);
ifsr( dt.getElementsByTagName("FRAME") );
ifsr( dt.getElementsByTagName("IFRAME") );
}
// iterate through all documents
dIr(document, null);
var ec = m_event_count + k_event_count + f_event_count + o_event_count;
var st = "Frames: " + g_frame_count;
if (iframe_count > 0) {
st += ". | Iframes: " + iframe_count;
}
if (refresh_count > 0) {
st += ". | Refresh: " + refresh_count;
}
if (layer_count > 0) {
st += ". | Layer: " + layer_count;
}
st += ". | Links: " + link_count
+ " (script: " + script_href_count
+ ", #: " + dummy_href_count
+ "; target: " + target_count + ")"
+ ". | Events: " + ec;
if ( ec > 0 ) {
st += " (Mouse: " + m_event_count
+ ", key: " + k_event_count
+ ", form: " + f_event_count
+ ", other: " + o_event_count + ")";
}
st += ". | Ext. scripts: " + countItems(scripts)
+ ", inline: " + inline_script_count
+ ". | FONT: " + font_count
;
alert(st + ".");
}());