The original browser history Javascript ran very slowly in Internet Explorer. When it needed to check thousands of sites, like for the gender test or my tag cloud, it could take several minutes. If it was going to be generally useful, I needed to speed it up a lot. The first thing I did was move the test link creation over to the server side, so there was a prebaked html div containing all the links, rather than building it on the fly. This didn't make much difference though, so I started poking at the testing code. What I found was that switching from array accessing to go through all the links towards grabbing the next sibling of an element seemed to make a massive difference. I've included the function below, and it now only takes a couple of seconds to check thousands of URLS:
function getVisitedSites()
{
var iframe = document.getElementById('linktestframe');
var visited = [];
var isIE = iframe.currentStyle;
if (isIE)
{
currentNode = iframe.firstChild;
while (currentNode!=null)
{
if (currentNode.nodeType==1)
{
var displayValue = currentNode.currentStyle["display"];
if (displayValue != "none")
visited.push(currentNode.innerHTML);
}
currentNode = currentNode.nextSibling;
}
}
else
{
var defaultView = document.defaultView;
var functionGetStyle = defaultView.getComputedStyle;
currentNode = iframe.firstChild;
while (currentNode!=null)
{
if (currentNode.nodeType==1)
{
var displayValue = functionGetStyle(currentNode,null).getPropertyValue("display");
if (displayValue != "none")
visited.push(currentNode.innerHTML);
}
currentNode = currentNode.nextSibling;
}
}
return visited;
}
Comments