Working around "Click to activate and use this control"
As you may likely be aware, the latest versions of Internet Explorer and Opera have decided not to give Eolas any money for their patent. Instead, users are forced to click on plugins (movies, sound, Flash and Java applets). In other words, anything inside object
, embed
or applet
tags.
Thankfully, there is a way around this. Microsoft has documented some workarounds. I've put together a solution here that works in Opera as well:
// only execute code if 'getElementsByTagName' and 'outerHTML' are supported if (document.getElementsByTagName && document.body.outerHTML) { // repeat code for each affected tag var tags = ['object','embed','applet']; for (var i in tags) { // get all elements with tag var objs = document.getElementsByTagName(tags[i]); for (var j=0;j < objs.length;j++) { var obj = objs.item(j); // find param tags within object var params = obj.getElementsByTagName('param'); var inner = ''; // if there are params, but param tags can't be found within innerHTML if (params.length && !/<param/i.test(obj.innerHTML)) // add all param tags to 'inner' string for (var x=0;x < params.length;x++) inner += params.item(x).outerHTML; // put 'inner' string with param tags in the middle of the outerHTML obj.outerHTML = obj.outerHTML.replace('>', '>' + inner); } } }
The code only executes on browsers which support getElementsByTagName and outerHTML (Internet Explorer, Opera and Safari - but not Firefox). It gets around the patent by dynamically "altering" the outerHTML (even though nothing is changed from the original HTML). But beware: you need to put it in an external JavaScript file to work.
To do this, simply put the code into a file. Let's say it's called eolas.js. Then put this line anywhere after all the object
, embed
or applet
tags:
<script type="text/javascript" src="eolas.js"></script>
Alternatively, you can keep the script tags out of the body by wrapping the code in eolas.js in a function, then use my addDOMLoadEvent function to run the Eolas script once the page has loaded. So if you change eolas.js like so:
function fixEolas() { // same code above }
then just put this in the <head>
of the page:
<script type="text/javascript" src="eolas.js"></script> <script type="text/javascript" src="adddomloadevent.js"></script> <script type="text/javascript"> addDOMLoadEvent(fixEolas); </script>
Unfortunately, the JavaScript file will be downloaded unnecessarily for users who don't use Internet Explorer or Opera. But if Safari or other browsers implement the same thing, this JavaScript code will already be in place to fix it.
And there you have it. Three cheers for horrible software patents!
Update: The code I posted before breaks objects with <param> tags in Internet Explorer. It turns out that outerHTML doesn't contain <param> tags, so extra work needs to be done to make sure they stay intact. I've updated the script accordingly.