Internet Explorer, Blocco degli ActiveX

Possibili rimedi al distruttivo update di Microsoft

Inserito il 25-05-2006

Come qualcuno avrà notato recentemente, un nuovo update di Windows, in particolare riferito al tanto popolare, quanto improponibile Internet Explorer, rende infruibili i contenuti legati ai controlli ActiveX, tra cui ovviamente i nostri beneamati Swf. In pratica per attivarli viene richiesto all'utente un ulteriore click sullo schermo, per proseguire poi la normale navigazione.

Chiaro è che per un navigatore smaliziato il problema non sussiste perchè sapendo a cosa quei controlli si riferiscono, proseguirà senza problema nella navigazione, il problema sta sulla percentuale decisamente più numerosa, che sospetterà (giustamente) ad uno dei soliti trucchetti per la trasmissione di dialer, virus e quant'altro di sporco e malsano ci sia in giro per la rete.

Lungi da questo articolo, stare a fare critica (che nel caso sarebbe solo negativa) su questo update, mi limito a riportare i link agli articoli e soluzioni già segnalate in altri forum, riguardanti il nuovo, destabilizzante problema.

Per saperne di più:

Supporto Tecnico Microsoft - Aggiornamento per ActiveX in Internet Explorer
http://support.microsoft.com/kb/912945/it-it'

Macromedia DevNet - Active Content Update Article (in inglese)
http://www.macromedia.com/dev...letter.html

Soluzioni al problema:

SWFObject (in inglese)
http://blog.deconcept.com/swfobject/
http://blog.deconcept.com/2005/12/15/inter...e-flash-plugin/

SWFObject (traduzione in italiano)
http://www.magnificaweb.it/flashobject/

Patch per Flash8 e FlashMx2004
http://www.macromedia.com/sup...ads.html#flash8

Per l'SWFObject riporto un post trovato in un forum, che descrive i passaggi essenziali per far andare i filmati anche con IE.

Nella pagina html l'swf deve essere inserito con questo codice:
<script type="text/javascript" src="flashobject.js"></script>
  
<div id="flashcontent">
  Mio movie alla Matrix!
</div>

<script type="text/javascript">
   var fo = new FlashObject("nomeFile.swf", "titolo", "400", "50", "6", "#000000");
   fo.write("flashcontent");

</script>
nella prima riga viene chiamato il file flashobject.js che quindi deve viaggiare insieme alla pagina html. Il file .js non dev'essere modificato e per evitare di doverselo portare dietro sempre è utile richiamarlo tramite un percorso assoluto, per esempio: <script type="text/javascript" src="http://www.tuosito.com/flashobject.js"> cosicchè ogni volta richiamerai lo stesso file. Quindi per semplificare il codice che ti serve diventa cosi:
<script type="text/javascript" src="http://www.tuosito.com/flashobject.js"></script>
  
<div id="flashcontent">
  Testo alternativo nel caso non si riesca a caricare il filmato.
</div>

<script type="text/javascript">
   var fo = new FlashObject("nomeFile.swf", "titolo", "400", "50", "6", "#000000");
   fo.write("flashcontent");
</script>
Naturalmente dovrai mettere il file .js nel posto giusto e settare le variabili vicino a new FlashObject: nome del file, titolo, larghezza, altezza, versione del player di pubblicazione, sfondo del filmato (non della pagina html).
...mi sembra tutto!!

Update

Altro interessante post scritto in un forum dall'utente andr3a, direi più completo ed esplicativo, oltre che ottimo a livello tecnico.

grazie al consiglio di and ho implementato flashobject sul mio ultimo sito.
non l'ho ovviamente implementato come visto qua e la perchè preferisco sempre ottimizzare dove mi è possibile ( soprattutto se non comporta una perdita di tempo oltre i 2 minuti :stordita: )
Questa è stata la mia soluzione
markedup per un swf al 100%
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="en">

	<HEAD>
		<TITLE>ELICA COLLECTION</TITLE>
		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
		<META NAME="author" CONTENT="Andrea Giammarchi 4 CANENERO Advertising">
		<META NAME="copyright" CONTENT="ELICA">

		<META NAME="code_Language" CONTENT="PHP4">
		<META NAME="robots" CONTENT="ALL">
		<STYLE TYPE="text/css">
			html, body {
				margin: 0px;
				padding: 0px;
				width: 100%;
				height: 100%;
				font-family: Verdana, Helvetica, sans-serif;
				font-size: 8pt;
				color: #FFF;
				background: #0F0D12;
			}
			#flash {
				width: 100%;
				height: 100%;
				text-align: center;
			}
			a {
				display: block;
				text-decoration:none;
			}
			img {
				margin-top: 25%;
				border: 0;
			}
		</STYLE>
		<SCRIPT TYPE="text/javascript" SRC="content.js"><!--// W3C safe string for content //--></SCRIPT>

		<SCRIPT TYPE="text/javascript" SRC="swfobject.js"><!--// (C) SWF Object 1.4.1 //--></SCRIPT>
		<SCRIPT TYPE="text/javascript">onload = function(){(new FlashObject("black.swf", "ELICA Collection", "100%", "100%", "8", "#0F0D12")).write("flash")};</SCRIPT>
	</HEAD>
	<BODY>
		<SCRIPT TYPE="text/javascript"><!--//
			document.write(content);
		//--></SCRIPT>

		<NOSCRIPT>
			<DIV ID="flash">
				<OBJECT TYPE="application/x-shockwave-flash" DATA="black.swf" WIDTH="100%" HEIGHT="100%">
					<PARAM NAME="movie" VALUE="black.swf" />
					<A
						HREF="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&promoid=BIOW"
						TITLE="Get Adobe Flash Player"
					>
						<IMG
							SRC="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif"
							ALT="Get Adobe Flash Player"
							WIDTH="88"
							HEIGHT="31"
						/>

					</A>
				</OBJECT>
			</DIV>
		</NOSCRIPT>
	</BODY>
</HTML>

questo markedup passa liscio come l'olio il validatore W3, per quello che conta (niente ma fa fico :D) e passa liscio come l'olio anche il più bastardo WATCHFIRE per WAI-AAA (lo so che non significa niente ... se non che almeno rispetta un pò tutti gli utenti se non altro per markedup).
Il sistema fa questo:
scrive via JS il contenuto del documento per chi ha JS abilitato ... allo stesso tempo nel JS scritto c'è il link al flash player per chi non ha Flash 8 (non ho idea di cosa rilasci FlashObject quando non trova il player) ed allo stesso tempo utilizza il metodo satay per chi non ha JS abilitato e scrive il link al player pe chi non ha Flash 8.

Il contenuto del file content.js è banalmente questo:
var content =
'<DIV ID="flash"> '+
	'<A '+
	'	HREF="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&promoid=BIOW" '+
	'	TITLE="Get Adobe Flash Player" '+
	'> '+
	'	<IMG '+
	'		SRC="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" '+
	'		ALT="Get Adobe Flash Player" '+
	'		WIDTH="88" '+
	'		HEIGHT="31" '+
	'	/> '+
	'</A> '+
'</DIV>';

messo in un file esterno per non avere noie col validatore del W3.

Spero che come soluzione sia completa e sia uno spunto per chi ancora (come me fino a ieri) non sa come raggirare il problema del bottone.

:ciauz:

[edit] dimenticavo ... per il metodo satay e in generale per il sito ho usato il primo swf di nome black.swf con questa sintassi sull'unico keyframe:

if(!getSWFVersion || getSWFVersion() < 8)
	getURL("http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&promoid=BIOW", "_self");
else
	loadMovieNum("mainmovie.swf", 0);

che altro non fa, per chi non ha js abilitato ma magari ha un player inferiore alla 8, che reindirizzare l'utente al sito adobe per scaricare il player

Update 2

Un ulteriore update necessario a spiegare a chi, come me, ha deciso di intraprendere la via dell'XHTML e si potrebbe trovare con un inconveniente nel caso in cui il javascript del browser con cui viene visualizzata la pagina che contiene il filmato, sia disabilitato.

Sempre utilizzando lo stesso metodo già descritto da andrea nel precedente update, questo è l'HTML da utilizzare nella pagina che ospiterà il nostro filmato

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
	<head>
		<title>V2online - Personal Portfolio </title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
		<style type="text/css">
			html, body {
				margin: 0;
				padding: 0;
				width: 100%;
				height: 100%;
				background-color:#FFFFFF;
			}
			div#container {
				overflow: hidden;
				width: 100%;
				height: 100%;
			}
			noscript {
				display: block;
				margin: 0;
				padding: 0;
				width: 100%;
				height: 100%;
			}
			object#filmato {
				width: 100%;
				height: 100%;
			}
		</style>

		<script type="text/javascript" src="content.js"><!--// W3C safe string for content //--></script>
		<script type="text/javascript" src="swfobject.js"><!--// (C) SWF Object 1.4.1 //--></script>
		<script type="text/javascript">onload = function(){(new FlashObject("cont2.swf", "V2online", "100%", "100%", "8", "#FFFFFF")).write("container")};</script>
	</head>
	<body>
		<script type="text/javascript"><!--//
			document.write(content);
		//--></script>
		<noscript>
			<div id="container">
				<object id="filmato" type="application/x-shockwave-flash" data="cont2.swf">
					<param name="movie" value="cont2.swf" />
				</object>
			</div>
		</noscript>

	</body>
</html>

In pratica non facciamo altro che dichiarare anche un foglio di stile particolare per il tag <noscript> in modo da trasformarlo da elemento "inline" a elemento "block" così da poter utilizzare le dimensioni in percentuale e mantenere l'swf a tutto schermo sul browser.