Povert

It's Pronounced "Pah-vert." You povert.

What’s Wrong With Ads

January 8th, 2010

Ads drive me nuts.

Not for the reasons it drive some people nuts — as long as they’re not intrusive, I don’t mind. I don’t regularly use AdBlock, though I do use ClickToFlash in Safari for various reasons. I don’t even think that Flash ads, per se, are a problem.

I see two basic problems:

  1. document.write()
  2. Invalid markup

document.write()

I hate document.write(). I’m pretty sure that I am That Guy At Work Who Hates document.write() With Unreasonable And Embarrassing Passion™, but it really does limit your options and it contributes to poor page load and rendering times.

Amazingly, a quick search of my past entries here turned up very little about my disdain for document.write(), so I’ll briefly summarize the problem.

Web browsers don’t handle external scripts very well. Because of things like document.write(), the browser actually has to pause the rendering of the page. Unfortunately, if the script is long-running or the server it’s on is slow or non-responsive, this can significantly increase the apparent page load time. Several mildly misbehaving external scripts on a page can have a dramatic cumulative effect. I set up an example of this while back to demonstrate this.

This is how most ads are delivered to a page. So a single ad placed anywhere before any important content on a page can block the display of that page until the ad is displayed.

There are ways around this. One way would be to have a external javascript file called early in the page. Then ad positions on the page wouldn’t be additional external script tags — they would be calls to a function or functions in that main javascript file (I believe Google Adsense allows for something like this method, at least in some circumstances). You could even get away with document.write() in this case, though that wouldn’t be eliminating problem #2. More on that in a moment. But there is still a basic problem here — we’re down to one external script, but if its host server is unresponsive, the display of all or most of the page will be held up until it resolves or times out.

Another way would be to dynamically create script tags and append them to the document’s head. These tags would point to the external scripts. But because they’re inserted this way, the browser doesn’t have to hold up the page rendering. YUI’s Get.script() does exactly this with some handy features thrown in as well. The big problem here is that document.write() is not compatible with this method. Unfortunately, 100% of ads out there are written out with document.write() by ad servers, regardless of whether they were written that way.

I’ve tried overriding document.write(). Last I checked, it actually works in Firefox:


(function(){
var els = document.getElementsByTagName('*'),
el = els[els.length - 1];
adURL = 'http://ad-server.com/blah';
document.write = function(str) {
if (typeof str != 'undefined') {
var newEl = document.createElement('span');
newEl.innerHTML = str;
var nodes = newEl.childNodes;
while (nodes.length) {
el.parentNode.appendChild(nodes[0]);
}
}
}
YAHOO.util.Get.script(adURL, {
onSuccess: function(){document.write = dwrite;}
});
})();

Guess how that pans out in IE?

(Yes, there are some flaws in the above code, but it was proof-of concept.)

And no, the defer attribute does not work when using document.write() and should be avoided anyway.

Invalid Markup

This problem is actually a consequence of problem #1. document.write() allows you to just toss arbitrary text and markup onto the page. There’s nothing to stop you from slapping this onto an otherwise nice page:


document.write('<div>Tacos</div>');

This can utterly destroy a page’s layout. All it takes is one bad ad to toss in one unmatched tag and a page’s layout will look like it got punched in the face and set on fire. The same thing could happen using innerHTML. However, using DOM methods avoids this problem:


var div = document.createElement('div');
adSpan.appendChild(div);
div.appendChild(document.createTextNode('Tacos'));

Yes, that appears to be more work. If your gripe with this solution is that you have to type more, please allow me to do to your face what a stray closing div can do to a page.

Mistakes can be made when doing it this way, but it eliminates an entire category of error that can sometimes be fairly difficult to track down. Even if you made 100% sure that your ad doesn’t output invalid html, all it takes is one person in the chain to do a bad copy & paste job to hose it up. It happens. It costs money and wastes time. It also makes me want to make the streets run red with the blood of my enemies.

Iframes, sadly, are not a solution to this problem. While it would contain the bad markup, they make certain type of ads hard or impossible to do. There is also a very long-standing Firefox bug in which iframes magically swap contents with each other.

What Can Be Done?

So where can we go from here? I wish I knew. I don’t think it’s realistic to expect that everyone writing ads out there change the way they write them. Maybe someone with Google’s clout could do this, but I can’t imagine that that would end well even for Google.

To make matters worse, whether the ad author avoids document.write() or not is actually irrelevant at this point because ad servers like DoubleClick actually take your ad code and document.write() it — leading to the silly (but common):


document.write('<noscript>Blah blah blah</noscript>');

Overriding document.write() would be a good intermediate step if it worked in IE, but it doesn’t.

This really is a serious problem. I can’t imagine how much potential revenue is lost to slow rendering pages as a result of ads which were supposed to generate revenue in the first place, not to mention the actual money spent on tracking down bad ads that are hosing up a page’s layout.

Flapping Crane is 5 Years Old

November 23rd, 2009

We launched the Flapping Crane website five years ago yesterday.

I had hoped to have the DVD set ready by now, but wrist pain prevented that. Instead, I’ve put up something about a squirrel.

The 11/3 Project

November 6th, 2009

Jon Stewart always cracks me up, but he hit this one out of the park.

The Daily Show With Jon Stewart Mon – Thurs 11p / 10c
The 11/3 Project
www.thedailyshow.com
Daily Show
Full Episodes
Political Humor Health Care Crisis

2-Month Update

October 27th, 2009

I’ve caught some flack from some friends for not updating this blog. Honestly, I haven’t had much to write about, aside from a draft post I wrote about Kurt Cobain in Guitar Hero 5. After I wrote it, though, I didn’t care to publish it. I wasn’t saying anything interesting; I was just bitching. Anyone who has been around be since GH5’s release has heard it from me anyway, and the rest of you can guess.

Anyway, I guess I’ll just say what I’ve been up to.

I picked up a turntable about a month ago. I went through my parents’ basement and found some good records (including some that were mine), so I figured I’d pick one up. It’s got a USB output, which is handy.

So I’ve been picking up vinyl here and there. I pre-ordered the vinyl remaster & cd of Nirvana’s Bleach (that should be here mid-November). I’ve grabbed a few John Lennon records, a Marvin Gaye and some 45s from Half Price Books in Apple Valley.

Vinyl doesn’t sound particularly better to me than CDs — a lot of them sound worse due to wear, in fact. They are fun, though. Keep in mind that I’ve got a fairly large iTunes library. I’ve ripped/digitized nearly all media under our roof. DVDs, VHS, CDs, cassette tapes, photos, you name it (except books — I’m not completely insane). I’m in the process of re-ripping my CDs in a lossless format (though I’m looking for a seamless way to transcode it when syncing to my iPhone or streaming to my Apple TV). I appreciate the convenience once this media is in my library. Still, it’s fun every now and then to put a record on. And I’m planning on digitizing at least some of them (my George Carlin records in particular).

We also finished mounting our plasma and installing speakers in the ceiling. My receiver can do 7.1, but the room was wired for 5.1. I may run some more wire eventually. But it’s otherwise great for now. Great, except when Kelly is trying to sleep upstairs in our room, conveniently located directly above the living room. So it’s loud as hell up there.

Not much news on the Flapping Crane front. I was furiously working on a DVD set, but it turned out to be too hard on my right wrist. I’ve had to do a wrist brace, painkillers, wrist exercises, all that. I wanted to have something ready for November 22nd, which is five years since we launched flappingcrane.com. That’s probably not going to happen though. We’ll see.

The new website is pretty much ready to launch, though. I’m just delaying it because I know that I’ll have to spend about 3 days fixing previously-missed bugs, and my aforementioned wrist is holding it up in committee.

Finally, I’ve been itching to do something. Not sure what. Some music, some Flapping Crane stuff, I don’t know. Maybe I’ll just build some shelves.

Povert is proudly powered by WordPress
Entries (RSS) and Comments (RSS).