Вызов нескольких функций в JavaScript без перезаписи оригинала - проблема полиморфизма? - PullRequest
1 голос
/ 16 декабря 2010

Я использую два разных плагина, для которых требуется функция onyoutubeplayerready:

http://code.google.com/p/jquery-tubular/
http://badsyntax.github.com/jquery-youtube-player/examples/player.html

Оба они объявляют и инициализируют функцию onyoutubeplayerready.Следовательно, один из плагинов не работает.

У меня есть три тега head:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript" src="js/jquery.youtube.player.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery.tubular.js"></script>

Оба сценария определены непосредственно перед конечным тегом body:

<script type="text/javascript">
//<![CDATA[

(function($){
    var config =  {

        repeatPlaylist: 1,

        // Custom playlist
        playlist: {
            title: 'Random videos',
            videos: [
                { id: 'CJCTiC1po8E', title: 'VCore Intro'},
                { id: 'ydCF922o944', title: 'VCore Admin' }, 
                { id: 'yC-_eqPqaoY', title: 'VCore Admin System' },
                { id: '7qkE30S2Btk', title: 'VCore Site' }
            ]
        }

        /*
        // Youtube playlist
        playlist: {
            playlist: '71B8152559FA2805'
        }

        // Latest user videos
        playlist: {
            user: 'TheSensless'
        }
        */
    };

    $('.youtube-player').player(config)

})(this.jQuery);
//]]>
</script>
<script type="text/javascript">
(function($){
function initializeTub(){
    $('body').tubular('_VKW_M_uVjw','wrapper');

}
$('a').click(function(){initializeTub()}); //clicking a random link just to test it
})(jQuery)
</script>

@ epascarello

Я попробовал ваше решение.У того, кто идет первым, есть это:

            window.onYouTubePlayerReady = function(id){ 
                console.log('2');


                var player = document.getElementById(id);

                player.addEventListener("onStateChange", 'onytplayerStateChange' + id);

                player.addEventListener('onError', 'onytplayerStateChange' + id);

                window['onytplayerStateChange' + id](9);
            };

У того, кто идет вторым, есть это:

var _onYouTubePlayerReady = onYouTubePlayerReady;
function onYouTubePlayerReady(playerId) {
console.log('1');
ytplayer = document.getElementById("myytplayer");
 ytplayer.setPlaybackQuality('medium');
 ytplayer.mute();

_onYouTubePlayerReady( playerId );

}

Консоль выводит это:

2
2

Следовательно, тот, который объявлен первым, называется оба раза.И второй никогда не вызывается, потому что консоль никогда не выдает 1.

Но согласно книге Справочник программиста JavaScript:

In fact, if you attempt to overload a function, the most recent definition will be used. This is because of the mutable nature of objects such as functions.

Так что если это так:

    <script type="text/javascript" src="js/jquery.youtube.player.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery.tubular.js"></script>

Поскольку одна функция, определенная в tubular, стоит на втором месте, почему она не указана, когда функция в конце концов вызывается?Обратите внимание, что на втором месте стоит трубчатый скрипт.

Кроме того, решение Фреда тоже не сработало.

Я попробовал это и тоже не сработало:

var _onYouTubePlayerReady = onYouTubePlayerReady;
function _onYouTubePlayerReady(playerId) {
console.log('1');
ytplayer = document.getElementById("myytplayer");
   ytplayer.setPlaybackQuality('medium');
   ytplayer.mute();

}
_onYouTubePlayerReady( playerId );

ByКстати, я понятия не имею, когда это вызывается, по-видимому волшебным вызовом Google в какой-то момент, но определенно не в любом из сценариев, поставляемых с плагином.

Спасибо за ответ.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2010

Вы можете изменить тот, который идет вторым, на что-то вроде этого

var _onYouTubePlayerReady = onYouTubePlayerReady;
function onYouTubePlayerReady(playerId) {
    //whatever code needs to be here
    _onYouTubePlayerReady( playerId );
}
0 голосов
/ 16 декабря 2010

Способ сделать это - запустить пользовательское событие с помощью функции jQuery .trigger() (я не знаю чистого способа JS сделать это). Затем вы можете изменить свой код на следующее:
Youtube.player.js

window.onMyCustomEventOne = function(id){ 
  var player = document.getElementById(id);
  player.addEventListener("onStateChange", 'onytplayerStateChange' + id);
  player.addEventListener('onError', 'onytplayerStateChange' + id);

            window['onytplayerStateChange' + id](9);
        };
    }

Tubular:

function onMyCustomEventTwo(playerId) {
  ytplayer = document.getElementById("myytplayer");
  ytplayer.setPlaybackQuality('medium');
  ytplayer.mute();
}

и в jQuery:

window.onYouTubePlayerReady = function(vars){
  $('window').trigger('myCustomEventOne',vars).trigger('myCustomEventTwo',vars);
};

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...