XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Javascript & Ajax (http://xhtmlforum.de/forumdisplay.php?f=83)
-   -   Javascript: generierte Funktionen im globalen Namespace? (http://xhtmlforum.de/showthread.php?t=63880)

sepp88 21.02.2011 08:43

Javascript: generierte Funktionen im globalen Namespace?
 
Hallo Leute,
ich bin kein Proficoder und mir wurde vor einiger Zeit bei einer (für mich) ziemlich kniffligen Frage weitergeholfen.

Ich habe mehrere dynamisch generierte (über PHP) YoutubePlayer auf meiner Seite. Alle will ich mit der YoutubePlayer Javascript API steuern. Das funktioniert mittlerweile super, da mir eben geholfen wurde.

Die Erklärung lautete, dass für jeden Player eine eigene onStateChange Funktion generiert wird (im globalen Namespace, oder so :).

PHP-Code:

function onYouTubePlayerReady() {
    ...
            
generateFuncidxthis );
    ...
    }
};

function 
generateFuncidxplayer ) {
    var 
fnName "state_change_" idx;
    
windowfnName ] = function( status ) {
        
playerStateChangestatusplayer );
    };

    
player.addEventListener("onStateChange"fnName);
}

function 
playerStateChangestatusplayer ) {
... 

Es klappt jedenfalls wunderbar, ich kann alle Youtubevideos über Javascript steuern und das ist was ich wollte.

Jetzt würde ich nur noch gerne eine kleine Erweiterung einbauen und zwar gibt es nicht nur einen "onStateChange" Event auf den man lauschen kann, sondern auch einen "onError" Event, der gefeuert wird, wenn ein Fehler mit einem Video auftritt.

Jetzt ist meine Frage, wie ich noch zusätzlich auf folgendes verwirkliche:

PHP-Code:

player.addEventListener("onError"fnName); 

Wo muss diese Zeile hin? Kann ich diese einfach innerhalb von generateFunc() hinzufügen? Oder muss ich eine komplett neue generateFunc() Funktion für diesen Event deklarieren? Oder muss ich innerhalb der bereits bestehenden generateFunc() wieder eine neue variable mit var fnName2 = "on_error_" + idx; und wieder im Namespace definieren?

Ich weiß einfach nicht ob ich Teile meines Codes wiederholen muss, oder wie das am einfachsten zu lösen ist?

Danke für die Hilfe.

protonenbeschleuniger 21.02.2011 12:36

Eine globale Funktion ist hier keineswegs nötig, da wurde dir etwas falsches erzählt. Du kannst hier eine anonyme Funktion einsetzen, wie auch bei dem onError Event.


Code:

player.addEventListener("onStateChange",  function( status ) {
    playerStateChange( status, this);
}
);


sepp88 21.02.2011 13:21

Danke für die schnelle Antwort.
Also dein Code müsste dann in der youtubePlayerReady() Funktion drin stehen, oder?

Nur nochmal als Übersicht, das wäre mein ganzer (derzeitiger) Code. Bist du dir sicher, dass ich die globale Funktion nicht brauche?

PHP-Code:

function onYouTubePlayerReady() {
    
currentLoaded++;
    if( 
currentLoaded == totalQuantity ) {
        
allPlayers.each(function( idx ) {
            
generateFuncidxthis );
            
this.unMute();            
        });
    }
};

function 
generateFuncidxplayer ) {
    var 
fnName "state_change_" idx;
    
windowfnName ] = function( status ) {
        
playerStateChangestatusplayer );
    };

    
player.addEventListener("onStateChange"fnName);
}

function 
playerStateChangestatusplayer ) {
    
    ...



protonenbeschleuniger 21.02.2011 13:43

zweimal Ja.

sepp88 21.02.2011 14:36

Danke, aber Nein, das funktioniert leider nicht. Sobald ich die generateFunc() weggebe und die deine Zeile innerhalb der onYoutubePlayerReady Funktion schreibe, funktioniert das automatische steuern der Videos nicht mehr. Z.b. wenn ein Video fertig ist soll automatisch das nächste gespielt werden. Das funktioniert nur mit generateFunc().

PHP-Code:

function generateFuncidxplayer ) {
    
    var 
statechange "state_change_" idx;
    var 
onerror "on_error_" idx;
    
    
windowstatechange ] = function( status ) {
        
playerStateChangestatusplayer );
    };
    
    
windowonerror ] = function( error ) {
        
playerOnErrorerrorplayer );
    };

    
player.addEventListener("onStateChange"statechange);
    
player.addEventListener("onError"onerror);


So funktioniert alles wunderbar. Ist das korrekt so wie ich das mache?

protonenbeschleuniger 21.02.2011 15:16

Mit dem Code, den du geziegt hast, sollte das ohne Probleme funktionieren.

PHP-Code:

function generateFuncidxplayer ) {
    


    
player.addEventListener("onStateChange", function(status){
        
playerStateChangestatusthis );
    } );
    
player.addEventListener("onError", function( error ) {
        
playerOnErrorerrorthis );
    }
);


Das geht aber nur, wenn die addEventListener Funktionen korrekt umgesetzt sind und innerhalb des Eventhandlers this auch auf das player Objekt zeigt.

sepp88 21.02.2011 15:35

Danke, aber nein leider, das funktioniert nicht. Das klappt nur mit der Version die ich eben gepostet habe. Aber solange meine Version funktioniert bin ich schon zufrieden, ich wollte nur wissen, ob das so in Ordnung ist wie ich das geschrieben habe, oder ob ich da technisch gesehen einen Fehler mache.

protonenbeschleuniger 22.02.2011 12:43

Wie gesagt das muss funktioneren, wenn es bei dir nicht tut, dann liegt das an dem Code den du uns nicht gezeigt hast oder du hast einen Fehler eingebaut (der in der Fehlerkonsole angezeigt wird)

Technisch gesehen hast du unötige globale Funktionen. Ob du einen Fehler gemacht hast, läßt sich natürlich nicht sagen ohne den kompletten Code zu kennen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:24 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2021, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2020