SWFobject в расширении Chrome - API недоступен - PullRequest
7 голосов
/ 01 сентября 2011

Привет!
Я создаю расширение Chrome, в которое мне нужно встроить SWFobject на фоновую страницу.
Все работает, кроме элементов управления JavaScript для SWFobject иeventListeners.
Я предполагаю, что это как-то связано с междоменными политиками, потому что при тестировании страницы на веб-сервере все работало нормально.

В любом случае вот фрагмент:

На главной странице:

var playerView =  chrome.extension.getBackgroundPage(); 
$('#playerPause').click(function(){
    playerView.playerPause();
});

На заднем плане:

function playerPause() {
    if (postData[nowPlaying].provider == 'youtube' ) {
        player.pauseVideo();
    } 
    else if (postData[nowPlaying].provider == 'soundcloud' ) {
        player.api_pause();
    };
}

И eventListeners :

soundcloud.addEventListener('onMediaEnd', playerNext);

function onYouTubePlayerReady(player) {
    player.addEventListener("onStateChange", "function(state){ if(state == 0) { playerNext(); } }");
}

В консоли выдается

"Uncaught TypeError: Object # не имеет метода 'pauseVideo '"

для обоих YouTube встраивают Soundcloud.

Кроме того, SWFobject встраивается следующим образом ( и работает ):

function loadTrack (id) {
    if(postData[id].provider == 'youtube') {
        swfobject.embedSWF(
            "http://www.youtube.com/e/" + postData[id].url + "?enablejsapi=1&playerapiid=player",
            "player",
            "1",
            "1",
            "8",
            null,
            {
                autoplay: 1
            },
            {
                allowScriptAccess: "always"
            },
            {
                id: "player"
            }
        );
    }
    else if(postData[id].provider == 'soundcloud') {
        swfobject.embedSWF(
            'http://player.soundcloud.com/player.swf',
            'player',
            '1',
            '1',
            '9.0.0',
            'expressInstall.swf',
            {
                enable_api: true, 
                object_id: 'player',
                url: postData[id].url,
                auto_play: true
            },
            {
                allowscriptaccess: 'always'
            },
            {
                id: 'player',
                name: 'player'
            }
        );
    }
}

Извините за длинный пост, я хотел предоставить как можно больше информации.
Кроме того, я знаю, что код не очень красивый, это было только мое второе приложение;)

Заранее большое спасибо всем, кто может помочь,
Джакомо

Ответы [ 2 ]

0 голосов
/ 03 августа 2013

Проблема здесь в том, что вы не можете использовать встроенные сценарии или встроенные обработчики событий в расширениях Chrome с тех пор, как манифест развился до версии 2.

Вы должны были добавить файл манифеста, чтобы я лучше понимал, что происходит. Но кратко все, что вы МОЖЕТЕ когда-либо сделать, это

На главной странице,

  • Удалите все встроенные сценарии и переместите их во внешний файл JS.
  • Удалите встроенные прослушиватели событий, переместите их на тот же или другой внешний JS и используйте

    addEventListener ().

Но проблема в том, что вы не можете выполнять вызовы SWF на фоновой странице или ожидать, что он что-нибудь вернет. Все это будет продолжать давать вам "Uncaught TypeError" Исключение.

Возьмем случай захвата изображения с веб-камеры, веб-камера будет передана на страницу, но вызов функции для нее никогда не будет выполнен, и, следовательно, изображение никогда не будет снято. Из-за этого мой проект по сканированию QR-кодов из всплывающего окна аддонов встретил руины.

0 голосов
/ 19 июня 2012

Вы можете взглянуть на это расширение , вы не можете получить доступ к локальному соединению в расширении Chrome, но вместо этого вы можете запустить скрипт контента как прокси-скрипт. (Вы можете открыть страницу прокси на gae или любые другие бесплатные серверы)

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