SWFobject : contrôle de l'objet Flash
Bonjour.
J'utilise JavaScript pour afficher des documents SWF (Flash) générés depuis des documents pdf par pdf2swf (swftools) dans des pages d'un site à l'aide de SWFObject comme suit :
Code:
1 2 3 4
| <div id="viewerContainer">
<div id="viewerControls">Boutons de contrôle</div>
<div id="viewerDiv"></div>
</div> |
Code:
1 2 3 4 5 6 7 8 9 10 11
| ...
var so = new SWFObject(objectPath, "viewerObj", viewerWidth, viewerHeight, "9", "#ffffff");
so.addParam("wmode", "transparent");
so.addParam("scale", "auto");
so.addParam("allowFullScreen", "true");
so.addParam("trace", "false");
so.addParam("allowScriptAccess", "always");
so.write("viewerDiv");
ratio = 297/210;
viewRatio = 0; |
L'animation Flash est correctement chargée et jusque là, tout va bien.
J'utilise ensuite quelques fonctions supplémentaires écrites en JS pour naviguer dans mon document :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
function showPagesCount () {
var flashMovie= document.getElementById('viewerObj');
document.getElementById('vcpages').innerHTML=flashMovie.TotalFrames();
document.getElementById('vcpagenum').max=flashMovie.TotalFrames();
}
function goToPage ( n ) {
var flashMovie = document.getElementById('viewerObj');
if (n==-1) {
n= parseInt(flashMovie.TGetProperty("/", 5));
}
if ( (n != flashMovie.TotalFrames()+1) && (n!=0) ) {
document.getElementById('vcpagenum').value = n;
flashMovie.GotoFrame( n-1 );
}
}
function zoomIn () {
var flashMovie= document.getElementById("viewerObj");
if (viewRatio++ >= 0) {
flashMovie.Zoom(90);
} else {
var viewerWidth = document.getElementById('viewerDiv').offsetWidth;
var viewerHeight= viewerWidth * ratio ;
flashMovie.width = (1 + (viewRatio/10)) * viewerWidth;
flashMovie.height= (1 + (viewRatio/10)) * viewerHeight;
}
}
function zoomOut () {
var flashMovie= document.getElementById("viewerObj");
if (viewRatio-- > 0) {
flashMovie.Zoom(110);
} else {
var viewerWidth = document.getElementById('viewerDiv').offsetWidth;
var viewerHeight= viewerWidth * ratio ;
flashMovie.width = (1 + (viewRatio/10)) * viewerWidth;
flashMovie.height= (1 + (viewRatio/10)) * viewerHeight;
}
}
function zoomReset () {
var flashMovie= document.getElementById("viewerObj");
viewRatio = 0;
flashMovie.Zoom(0);
var viewerWidth = document.getElementById('viewerDiv').offsetWidth;
var viewerHeight= viewerWidth * ratio ;
flashMovie.width = (1 + (viewRatio/10)) * viewerWidth;
flashMovie.height= (1 + (viewRatio/10)) * viewerHeight;
}
function zoomBestFit () {
var maxHeight= window.innerHeight-(20+viewer.offsetTop);
var maxWidth = document.getElementById('viewerdiv').offsetWidth;
var viewerHeight= Math.min(maxHeight, maxWidth * ratio);
var viewerWidth = viewerHeight / ratio;
var flashMovie= document.getElementById("viewerObj");
flashMovie.Zoom(0);
viewRatio = Math.round(10*(viewerWidth/(document.getElementById('viewerDiv').offsetWidth)-1));
flashMovie.width = viewerWidth;
flashMovie.height= viewerHeight;
} |
Les résultats diffèrent d'un navigateur à l'autre :
- Avec Chrome, tout fonctionne à merveille.
- Avec Opera, tout fonctionne aussi.
- Sous MSIE 8/9 (64/32), les fonctions de Zoom fonctionnent toutes mais pas gotoPage(n).
Citation:
SCRIPT438: Cet objet ne gère pas cette propriété ou cette méthode (flashMovie.TotalFrames())
- Avec Firefox (3.6/Linux, 8/Windows 7), le comportement est bien plus étrange : toutes ces fonctions fonctionnent bien jusqu'à ce que j'utilise la fonction switchFullPage().
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| function switchFullPage () {
var flashMovie = document.getElementById('viewerObj');
viewerContainer= document.getElementById("viewerContainer");
if (viewerContainer.className=="embeddedViewer") {
viewerContainer.className = "fullScreenViewer";
document.getElementsByTagName("body")[0].style.overflow="hidden";
zoomReset();
} else {
viewerContainer.className = "embeddedViewer";
document.getElementsByTagName("body")[0].style.overflow="auto";
zoomBestFit();
}
} |
Suite à l'utilisation de cette fonction, FF3.6 et 8, j'ai les erreurs suivantes :
Citation:
flashMovie.Zoom is not a function
Citation:
flashMovie.TGetProperty is not a function
Citation:
flashMovie.TotalFrames is not a function
dès que les méthodes de l'objet flashMovie sont utilisées.
Je saurais contourner le problème du zoom lorsque le facteur de zoom est inférieur à 0 (zoom arrière géré par les dimensions de l'objet sans l'appel à la méthode Zoom), mais la gestion de page est beaucoup plus embetante.
Je constate par ailleurs, que les navigateurs avec lesquels tout fonctionne conservent le contexte d'affichage lors de l'utilisation de switchFullPage alors que les autres reviennent sur la première page, comme si l'objet SWF était ré-initialisé, un peu comme si le DOM était reconstruit et que mes objets n'existaient plus...
Merci d'avance de votre aide.