Несоответствие поведения JavaScript

Кажется, у меня небольшая проблема с моим JavaScript: он работает, как и ожидалось, в JSFiddle, но не при открытии из локального файла .html.

Вот код, как он есть на моем жестком диске:

<html>

<head>
    <script type='text/javascript'>
        window.onPlayerLoad = function () {
            alert("test");
        };
    </script>
</head>

<body>
    <object bgcolor='#000000' data='http://www.twitch.tv/widgets/archive_embed_player.swf' height='378' id='clip_embed_player_flash' type='application/x-shockwave-flash' width='620'>
        <param name='movie' value='http://www.twitch.tv/widgets/archive_embed_player.swf'>
        <param name='allowScriptAccess' value='always'>
        <param name='allowNetworking' value='all'>
        <param name='allowFullScreen' value='true'>
        <param name='flashvars' value='title=IEM%2BSingapore&amp;channel=esltv_sc2&amp;auto_play=false&amp;start_volume=25&amp;archive_id=484099469&amp;initCallback=onPlayerLoad'>
    </object>
</body>

</html>

А вот он на JSFiddle: http://jsfiddle.net/77Bpa/.

Цель этого кода — загрузить проигрыватель Twitch и вызвать функцию после завершения загрузки. Должна быть вызвана функция window.onPlayerLoad, и она передается во flash-объект через flashvar initCallback (см. API Twitch Player).

Итак, на JSFiddle предупреждение появляется, как и ожидалось, однако, когда я открываю файл локально, такого эффекта нет. И Firefox, и Internet Explorer говорят, что window.onPlayerLoad существует, но не вызывается.

Что может быть причиной этой проблемы?

Заранее спасибо.


person Michael Bikovitsky    schedule 01.12.2013    source источник
comment
Меня устраивает. Возможно, вам следует подождать секунду, потому что загрузка занимает секунду или две.   -  person luke1985    schedule 01.12.2013
comment
Я вижу, что вы определили функцию как window.onPlayerLoad, но ваш обратный вызов просто onPlayerLoad. Я бы постарался, чтобы они согласились.   -  person bitfiddler    schedule 01.12.2013
comment
@ lukasz1985, я подождал несколько секунд, плеер завершил загрузку, а окна с предупреждением по-прежнему нет. @bitfiddler: пробовал, не работает. На самом деле это то, как официальная документация говорит об этом (объявить как window.onPlayerLoad, передать объекту как onPlayerLoad).   -  person Michael Bikovitsky    schedule 01.12.2013
comment
Во-первых: это может не помочь, но попробуйте сделать var onPlayerLoad = ... вместо window.onPlayerLoad = .... Во-вторых, более возможно - проверьте это с помощью чего-то вроде console.log(test) и посмотрите, как загружается сайт с помощью консоли браузера. открыть при отладке JavaScript. Как минимум - попробуйте поставить точку останова с помощью браузера. Обратный вызов может все еще работать, но что-то может быть не так с загрузкой файлов из локальной файловой системы в вашем браузере.   -  person luke1985    schedule 01.12.2013
comment
@lukasz1985, попытался установить точку останова как перед объявлением обратного вызова, так и внутри обратного вызова. Тот, что перед объявлением, срабатывает, а тот, что внутри, — нет. Кроме того, замена window.onPlayerLoad на var onPlayerLoad не дает никакого эффекта.   -  person Michael Bikovitsky    schedule 01.12.2013
comment
Похоже, проблема в том, что вы обращаетесь к странице из локальной файловой системы с протоколом file://. Это не работает, как я обнаружил сейчас. Вы должны создать хост и получить к нему доступ через http://   -  person luke1985    schedule 01.12.2013
comment
Ух ты. Это сработало. Никогда бы не подумал об этом. Спасибо, @lukasz1985. Если вы напишете ответ, я отмечу его как принятый.   -  person Michael Bikovitsky    schedule 01.12.2013
comment
Ну, такие вопросы обычно являются последним средством. Я дам ответ на этот вопрос, чтобы он не завис в воздухе, но не стесняйтесь изменить принятый ответ, если кто-то придет с подробным объяснением.   -  person luke1985    schedule 01.12.2013


Ответы (1)


Как указано в моем комментарии, проблема заключается в том, что флэш-память не вызывает обратный вызов по какой-то неизвестной мне причине, связанной с протоколами, используемыми при запросе страницы, на которой она используется. Использование http:// поверх file:// решает проблему. Таким образом, простая загрузка или использование локального хоста для запроса страницы с проигрывателем работает нормально и терпит неудачу при загрузке html-файла в браузер из локальной файловой системы.

person luke1985    schedule 01.12.2013