IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[DOM] Error calling method on NPObject! (QuickTime + DOM + Firefox)


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Points : 19
    Points
    19
    Par défaut [DOM] Error calling method on NPObject! (QuickTime + DOM + Firefox)
    Bonjour à tous,

    Je suis en train de créer un module permettant d'intégrer un film QuickTime dans une page utilisant Javascript et DOM pour personnaliser l'apparence du lecteur.

    Après avoir ingurgité tout ça : http://developer.apple.com/documenta...section_6.html

    Et revu la façon de déclarer cet objet pour supprimer la balise EMBED et générer un code valide, j'ai réussi à mettre en place ce lecteur. Il fonctionne très bien sous Safari, pas encore testé sous IE, mais sous Firefox j'obtiens l'erreur suivante (grâce à Firebug) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Error calling method on NPObject!
    movieLoaded()
    document.movie4948ed7c7dacb.GetRectangle();
    Ce que j'en comprend, c'est que Firefox n'aime pas trop la façon dont j'appelle GetRectangle().

    Cette fonction movieLoaded me sert à gérer la taille des éléments de mon player en fonction de la taille de la vidéo.

    Ce qui s'affiche, c'est mon player, sans la vidéo (). En tripotant le CSS pour forcer la taille de la balise object, la vidéo s'affiche, et peut se contrôler via mes boutons. Mais sans ça, lors du clic sur Play, je n'entend même pas le son...

    Si je supprime le contenu de ma fonction movieLoaded, le reste s'exécute correctement.

    J'ai passé la nuit à m'arracher les cheveux là dessus, si quelqu'un sait ce qui se passe, je prie devant sa photo tous les soirs

    Voici le code complet de la page renvoyant l'erreur :

    (et un zip contenant tout ce qu'il faut pour reproduire l'erreur en fichier joint)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    <html>
    	<head>
    		<style type="text/css">
    			@import url('./style.css');
    		</style>
    		<script language="javascript" type="text/javascript">
    <!--
    /* define function that shows percentage of movie loaded */
    function showProgress() {
    	var percentLoaded = 0 ;
    	percentLoaded = parseInt((document.movie4948f3ecad006.GetMaxTimeLoaded() / document.movie4948f3ecad006.GetDuration()) * 100);
    	document.getElementById("loadStatus").innerHTML=+percentLoaded + '%';
    	document.getElementById("loadStatus").style.width=percentLoaded + '%';
    	var rectangle = document.movie4948f3ecad006.GetRectangle();
    	var rectangle = rectangle.split(",");
    	document.movie4948f3ecad006.SetRectangle(rectangle);
    	document.getElementById("player").width=rectangle[2]+"px";
    	document.getElementById("player").height=rectangle[3]+"px";
    	document.getElementById("loadStatus").style.width=rectangle[2];
    }
     
    /* define function that executes when movie loading is complete */
    function movieLoaded() {
    	var rectangle = document.movie4948f3ecad006.GetRectangle();
    	var rectangle = rectangle.split(",");
    	document.movie4948f3ecad006.SetRectangle(rectangle);
    	document.getElementById("player").width=rectangle[2]+"px";
    	document.getElementById("player").height=rectangle[3]+"px";
    	document.getElementById("movie4948f3ecad006").width=rectangle[2]+"px";
    	document.getElementById("movie4948f3ecad006").height=rectangle[3];
    	document.getElementById("loadStatus").style.width=rectangle[2];	
    }
     
    function showTime(){
    	var current = document.movie4948f3ecad006.GetTime();
    	var max = document.movie4948f3ecad006.GetDuration();
    	var rate = (current/max)*100;
    	document.getElementById("played").style.width=rate+"%";
    	setTimeout("showTime()", 250);
    }
     
    function myAddListener(obj, evt, handler, captures) {
    	if ( document.addEventListener )
    		obj.addEventListener(evt, handler, captures);
    	else
    		// IE
    		obj.attachEvent('on' + evt, handler);
    }
     
    /* define functions that register each listener */
    function RegisterListener(eventName, objID, embedID, listenerFcn) {
    	var obj = document.getElementById(objID);
    	if ( !obj )
    		obj = document.getElementById(embedID);
    	if ( obj )
    		myAddListener(obj, eventName, listenerFcn, false);
    }
     
    /* define a single function that registers all listeners to call onload */
    function RegisterListeners() {
    	RegisterListener('qt_progress', 'movie4948f3ecad006', 'qtmovie_embed', showProgress);
    	RegisterListener('qt_load', 'movie4948f3ecad006', 'qtmovie_embed', movieLoaded);
    	RegisterListener('qt_play', 'movie4948f3ecad006', 'qtmovie_embed', showTime);
    }
    //-->
    		</script>
    	</head>
    	<body onload="RegisterListeners();">
    		<div class="player" id="player">
    			<object id="movie4948f3ecad006" name="movie4948f3ecad006" type="video/quicktime" codebase="http://www.apple.com/qtactivex/qtplugin.cab" autoplay="false" data="http://linux.duke.edu/~cegeddin/mov/rockwall.mov" controller="false" EnableJavaScript="true" postdomevents="true">
    				<param name="src" value="http://linux.duke.edu/~cegeddin/mov/rockwall.mov" style="behavior:url(#qt_event_source);">
    			</object>
    			<div id="loadStatus">
    				<div id="played" style="width:0;"></div>
    			</div>
    			<div id="control">
    				<a href="javascript:document.movie4948f3ecad006.Play();">play</a>
    				<a href="javascript:document.movie4948f3ecad006.Stop();">pause</a>
    			</div>
    		</div>
    	</body>
    </html>
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip qt.zip (7,7 Ko, 57 affichages)

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    OK, je ne suis pas surpris du nombre de réponses à ce topic vu que pas grand monde utilise de lecteur QuickTime personnalisé sur ses pages. En ce qui me concerne, je hais profondément Flash (pour plein de raisons et notamment sa consommation de processeur) et dans l'attente d'une solution Open Source correcte, j'utilise QT...

    Je n'ai pas résolu mon problème mais j'ai trouvé une réponse :

    C'EST IMPOSSIBLE SI ON VEUT ETRE EN XHTML VALIDE

    En fait, de IE, Firefox & Safari, le navigateur d'Apple est le seul à gérer les DOM propres au plug-in QuickTime sans balise embed. J'en suis quasiment sûr, et il me semble que cette ligne de la page idoine du site d'Apple explique cela (d'une façon certes obscure pour moi) :

    Note: Netscape first introduced JavaScript support using the LiveConnect interface. Netscape 6, FireFox, and Mozilla 1.0 support JavaScript using the newer XPCOM interface. Safari 1.3 and later for Macintosh also support a Cocoa interface. Internet Explorer for Windows allows JavaScript to interact with plug-ins using the COM interface. Current versions of Mozilla, Opera, and Safari for Windows and Macintosh support npruntime.
    La solution est donc d'utiliser le script fournit par Apple "AC_QuickTime.js", pour générer le lecteur avec un embed. Ainsi, il n'existe pas dans le code source et le W3C n'y voit que du feu.

    Si quelqu'un d'autre est intéressé par ce sujet, voici une page de démo d'un player fonctionnel (mais pas valide du coup) :
    http://web.mac.com/eric.carlson/even.../detailed.html

    Voili voilou, bonne fin de journée à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Error calling method on NPObject
    Par dré kam dans le forum Flash/Flex
    Réponses: 0
    Dernier message: 18/04/2012, 15h06
  2. Uploadify - Error calling method on NPObject!
    Par PseT34 dans le forum jQuery
    Réponses: 0
    Dernier message: 08/02/2011, 15h37
  3. Error calling action method of component
    Par Emir83 dans le forum JDBC
    Réponses: 6
    Dernier message: 16/12/2009, 21h50
  4. Error : can't call method "fetchrow_array"
    Par juzii dans le forum SGBD
    Réponses: 16
    Dernier message: 22/07/2008, 18h03
  5. Réponses: 0
    Dernier message: 25/02/2008, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo