Source code for bookmarklet Frame Stats.
javascript:
(function(){
function countItems(a)
{
return a.length;
}
function hasAttribute(e, a)
{
return e.hasAttribute(a);
}
var noframes_count = 0;
var iframe_count = 0;
var frames = [];
var unique_frames = [];
var repeat_frames = [];
var g_anon_count = 0;
var g_frame_count = 0;
var g_noscroll_count = 0;
var frameset_count = 0;
var frameset_doc_count = 0;
function eD(dt, f) {
if (f != null) {
++g_frame_count;
g_noscroll_count += (f.scrolling.toLowerCase() == "no") ? 1 : 0;
g_anon_count += hasAttribute(f, "NAME") ? 0 : 1;
frames[f.src] = f.src;
if (unique_frames[f.src] != f.src && repeat_frames[f.src] != f.src)
{
unique_frames[f.src] = f.src;
}
else
{
unique_frames[f.src] = null;
repeat_frames[f.src] = f.src;
}
}
var fsc = dt.getElementsByTagName("FRAMESET").length;
if (fsc > 0) {
frameset_count += fsc;
++frameset_doc_count;
}
noframes_count += dt.getElementsByTagName("NOFRAMES").length > 0 ? 1 : 0;
iframe_count += dt.getElementsByTagName("IFRAME").length;
}
// "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 st = "Framesets: " + frameset_count;
if (frameset_doc_count > 1)
{
st += " (in " + frameset_doc_count + " documents)";
}
if (g_frame_count > 0)
{
st += ". | Frames: " + g_frame_count
+ " (unique: " + countItems(unique_frames)
+ ", repeated: " + countItems(repeat_frames)
+ ", anonymous: " + g_anon_count
+ ", non-scrolling: " + g_noscroll_count + ")"
+ ". NOFRAMES: " + (noframes_count > 0 ? "yes" : "no");
}
if (iframe_count > 0)
{
st += ". | IFRAME: " + iframe_count;
}
alert(st + ".");
}());