La balise object
- incorporer du contenu en HTML valide strict -
Qu'est ce que la balise object
Beaucoup de monde insère des médias dans leur page web avec la
balise non standard <embed>
. Pourtant il existe une
balise standardisée pour ce genre d'insertion, la balise
<object>
. Effectivement
il n'est pas immédiat de l'utiliser de manière
inter-navigateurs, mais nous allons voir qu'il existe des techniques pour
que quasiment tous les navigateurs puissent interpréter le code.
La spécification HTML 4.01 présente l'élément
<object>
ainsi :
...HTML 4 introduit l'élément OBJECT, qui offre une solution générale aux inclusions d'objets génériques. L'élément OBJECT permet aux auteurs HTML de spécifier tout ce que l'objet requiert pour sa présentation par un agent utilisateur : le code source, les valeurs initiales et les données d'exécution [ndt. run-time data]. Dans cette spécification, on emploie le terme « objet » pour désigner les choses que les personnes mettent dans les documents HTML ; les termes usuels courants pour ces choses sont : les applets, les modules d'extension [ndt. plug-ins], les gestionnaires de média [ndt. media handlers], etc.
Cet élément est conçu pour insérer toute sorte
de document. On spécifie de quelle sorte avec l'attribut
type
en indiquant le type mime, et la
source du document avec l'attribut data
en indiquant son URI.
Si le navigateur, ou un de ses plugins, sait interpréter ce
document, il le fait sinon le contenu imbriqué est affiché.
Tout code HTML peut être insérer comme contenu alternatif,
par exemple un lien vers le document, ou une image à la place d'une
animation. Ce peut également être un autre object, on parle de
"d'object imbriqués".
Pour beaucoup de types de document, c'est tout !
exemples :
incorporer un document HTML
<object data="data/test.html" type="text/html" width="300" height="200"> alt : <a href="data/test.html">test.html</a> </object>
incorporer un document pdf
<object data="data/test.pdf" type="application/pdf" width="300" height="200"> alt : <a href="data/test.pdf">test.pdf</a> </object>
Vous pouver spécifier des paramètres relatifs au document par
l'intermédiaire de la balise param
. IE a parfois besoin
du paramètre src
pour localiser correctement la source.
incorporer un document wav
<object type="audio/x-wav" data="data/test.wav" width="200" height="20"> <param name="src" value="data/test.wav"> <param name="autoplay" value="false"> <param name="autoStart" value="0"> alt : <a href="data/test.wav">test.wav</a> </object>
Le paramètre
est compréhensible
par QuickTime, autoplay
par Windows Media Player et
Real Audio.
autoStart
Cas plus compliqués
Pour certains types, comme les documents QuickTime, IE a besoin d'une valeur
non standard pour l'attribut standard classid
, un identifiant
pour charger un activeX associé.
insertion d'un document QuickTime uniquement pour IE
<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="320" height="240"> <param name="src" value="data/test.mov" > alt : <a href="data/test.mov">test.mov</a> </object>
Nous allons imbriquer un autre object comme contenu alternatif, pour les autres navigateurs qui utilisent la formulation standard :
object imbriqués
<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="320" height="240"> <param name="src" value="data/test.mov" > <param name="controller" value="true" > <param name="autoplay" value="false"> <object type="video/quicktime" data="data/test.mov" width="320" height="240"> <param name="controller" value="true" > <param name="autoplay" value="false"> alt : <a href="data/test.mov">test.mov</a> </object> </object>
Çà marche, mais malheureusement IE a un bogue, il affiche une
zone vierge pour le second object.
Ce bug est résolu dans IE7, mais pour les versions plus anciennes,
nous devons masquer ce second object. Pour celà nous avons deux
techniques, les commentaires conditionnels de IE, ou par les CSS.
Masquer l'object imbriqué avec les commentaires conditionnels d'IE
IE5 introduit les commentaires conditionnels, qui sont bien pratiques pour compenser les bogues d'IE. Cette méthode n'est pas compréhensible par les versions plus anciennes d'IE, mais heureusement elles ne sont presque plus utilisées.
Nous pouvons coder deux object, un spécialement pour IE, et un autre pour les navigateurs respecteux des standards :
<!--[if IE]> <object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="320" height="240"> <param name="src" value="data/test.mov" > <param name="controller" value="true" > <param name="autoplay" value="false"> </object> <![endif]--> <!--[if !IE]> <!--> <object type="video/quicktime" data="data/test.mov" width="320" height="240"> <param name="controller" value="true" > <param name="autoplay" value="false"> alt : <a href="data/test.mov">test.mov</a> </object> <!--<![endif]-->
Mais comme IE7 corrige ce bug, je préfère les utiliser avec des object imbriqués :
<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="320" height="240"> <param name="src" value="data/test.mov" > <param name="controller" value="true" > <param name="autoplay" value="false"> <!--[if gte IE 7]> <!--> <object type="video/quicktime" data="data/test.mov" width="320" height="240"> <param name="controller" value="true" > <param name="autoplay" value="false"> alt : <a href="data/test.mov">test.mov</a> </object> <!--<![endif]--> <!--[if lt IE 7]> alt : <a href="data/test.mov">test.mov</a> <![endif]--> </object>
Masquer l'object imbriqué par les CSS
L'autre solution est d'utiliser quelques hacks CSS pour masquer l'object imbriqué. Nous devons utiliser un hack pour créer des règles appliquées uniquement par IE pour masquer l'object, et un autre pour le rendre de nouveau visible à IE Mac.
classe spéciale pour IE (placer la dans une balise style
dans
le head
du document HTML, ou dans une feuille de style liée)
/* masquer le deuxième object pour toutes les versions de IE */ * html object.hiddenObjectForIE { display: none; } /* afficher le deuxième object uniquement pour IE Mac */ /* IE Mac \*//*/ * html object.hiddenObjectForIE { display: inline; } /**/
et appliquer ce style à l'objet imbriqué
<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="320" height="240"> <param name="src" value="data/test.mov" > <param name="controller" value="true" > <param name="autoplay" value="false"> <object type="video/quicktime" data="data/test.mov" width="320" height="240" class="hiddenObjectForIE"> <param name="controller" value="true" > <param name="autoplay" value="false"> alt : <a href="data/test.mov">test.mov</a> </object> </object>
Cette technique pose quelque problème avec les documents java (et peut être quelques autres), une alerte de sécurité est affichée au chargement, et le contenu alternatif est également affiché.
Essais
Résultats résumés
Tous les résultats pour divers navigateurs, avec quelques notes.
série HTML
Tests d'insertion de divers types de contenu en HTML 4.01 valide strict avec la balise object.
- types text
- text/html (fichier html)
- text/plain (fichier txt)
- text/css (fichier css)
- text/javascript (fichier js)
- text/richtext (fichier rtf)
- text/rtf (fichier rtf)
- application/rtf (fichier rtf)
- types application
- application/pdf (fichier pdf)
- application/postscript (fichier ps)
- application/vnd.oasis.opendocument.text (fichier odt)
- application/vnd.oasis.opendocument.spreadsheet (fichier ods)
- application/vnd.oasis.opendocument.presentation (fichier odp)
- application/vnd.sun.xml.writer (fichier sxw)
- application/vnd.sun.xml.calc (fichier sxc)
- application/vnd.sun.xml.impress (fichier sxi)
- application/msword (fichier doc)
- application/vnd.ms-excel (fichier xls)
- application/vnd.ms-powerpoint (fichier ppt)
- types video
- video/mpeg (fichier mpg)
- video/avi (fichier avi)
- video/x-ms-wmv (fichier wmv)
- video/quicktime (fichier mov)
- types audio
- audio/x-wav (fichier wav)
- audio/mpeg (fichier mp3)
- application/ogg (fichier ogg)
- audio/x-midi (fichier mid)
- divers autres types
- image/svg+xml (fichier svg)
- application/x-shockwave-flash (fichier swf)
- audio/x-pn-realaudio-plugin (fichier rm, avec commentaires IE)
- audio/x-pn-realaudio-plugin (fichier rm, masquer par CSS)
- application/x-java-applet (applet java)
- unknown/unknown, quelques tests avec un type mime factice.
série XHTML
La formulation XHTML de object
est quasiment la même qu'en HTML,
la seule différence est que les balises param
sont fermées.
Néanmoins, voici la même
série de test en XHTML 1.0 strict.
Merci à Flore d'avoir effectuer les tests sous Safari, et à Cécile ceux sous IE Mac.