YouTube embed: небезопасная попытка JavaScript получить доступ к кадру


У нас есть калитка приложение со страницей, которая включает в себя встроенное видео Youtube. Видео вставляется и воспроизводится нормально, но, по - видимому, это заставляет остальную часть страницы не визуализировать-кажется, что элементы DOM приходят после вставить просто не появляются на странице, несмотря на то, что в разметке.

глядя на консоль ошибок в Chrome показывает:

небезопасная попытка доступа к JavaScript кадр с URL-адресом http://example.com/detail/COMMUNICATION/search/com-sonyericsson-hanashi из кадра с URL-адресом http://www.youtube.com/embed/eJY7_De5opI?enablejsapi=1&autohide=1&showinfo=1. Домены, протоколы и порты должны спичка.

я погуглил это довольно много, и люди, кажется, говорят, что это безобидно и игнорировать его. Это просто кажется неправильным, и в нашем случае это действительно ломает страницу.

Если мы изменим наше приложение так, что видео встроено динамически через обратный вызов ajax (пользователь нажимает на калитку AjaxLink) мы все еще получаем ошибку в консоли, но по крайней мере страница отображается полностью. К сожалению, это не будет работать для нас, так как нам нужно, чтобы видео загружалось по умолчанию, когда пользователь впервые попадает на страницу.

Edit: я должен добавить, что, хотя сообщение об ошибке было взято из консоли Chrome, ошибка, похоже, влияет на каждый браузер, который я пробовал: Chrome, Safari и Firefox.

5 55

5 ответов:

ошибка безопасности вряд ли сломает вашу страницу. Похоже, что ошибка происходит из кадра YouTube, что означает, что в худшем случае содержимое кадра будет перепутано.

фрейм / iframe с внешней страницы не может ни при каких обстоятельствах влиять на содержимое родительского документа, если они не относятся к одному домену и номеру порта. Это одно из жестких правил безопасности браузера.

ошибка должна быть в другом месте разметка. Есть шанс увидеть какой-то пример разметки?

[edit]

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

обычно, когда возникают такие проблемы, это происходит из-за незамкнутого тега где-то, но это может быть и Javascript.

Если у вас возникла проблема с устранением этой ошибки JavaScript, вы можете попробовать использовать старый код вставки YouTube. Это опция на каждом видео YouTube, как только вы нажмете на embed. У вас не будет этой ошибки, потому что она не использует iframes. Код будет выглядеть примерно так:

<object width="560" height="315">
    <param name="movie" value="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0"></param>
    <param name="allowFullScreen" value="true"></param>
    <param name="allowscriptaccess" value="always"></param>
    <embed src="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed>
</object>

надеюсь, что это помогает.

Я проголосовал за ответ Джонатана Торреса, потому что его код остановил предупреждения Javascript. Однако затем я обнаружил ошибки при проверке кода.

Итак, мой ответ таков...

установите флажок "Использовать старый код вставки" при использовании кода вставки YouTube, чтобы вы не использовали iframe.

чтобы сделать код проверки вам нужно добавить....

type="movie"

и

data="http://SAME YOUTUBE URL USED IN THE FIRST PARAM ELEMENT/"

до объект элемент. После этого сделайте параметр элементы самозакрывающиеся (но не EMBED элемент).

это должно сделать ваш код YouTube выглядеть так...

<object width="560" height="315" type="movie" data="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0">
<param name="movie" value="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0"></param><param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<embed src="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed>
</object>

вы тогда не должны получать никаких предупреждений Javascript и ваш код должен проверить.

The небезопасная попытка JavaScript получить доступ к фрейму ошибка не имеет ничего общего с вашей страницы не оказывает. Сломанная разметка (например, отсутствует </iframe>) является наиболее вероятной причиной.

что касается небезопасная попытка JavaScript получить доступ к фрейму ошибки, у вас есть несколько вариантов:

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

  2. ручное решение состоит в том, чтобы построить <iframe> теги и добавить &origin=http://example.com параметр для URL-адресов. Цитата:

В качестве дополнительной меры безопасности, вы также должны включить происхождение параметр к URL-адресу, указание схемы URL (http: / / или https://) и полный домен вашей хост-страницы в качестве значения параметра. В то время как происхождение не является обязательным, в том числе он защищает от вредоносных сторонних JavaScript вводится на вашу страницу и захватывает контроль над вашим Проигрыватель YouTube.

для меня это работало с помощью кода здесь: https://developers.google.com/youtube/iframe_api_reference#Loading_a_Video_Player

строки, которые я исправил, видят рынок слов с 2 asterix**код:

из этого:

var tag = document.createElement('script');
          tag.src = "**http://www.youtube.com/player_api**";
          var firstScriptTag = document.getElementsByTagName('script')[0];
          firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
          var players = new Array();
          function **onYouTubePlayerAPIReady()** {

        var ids = $('div.video div');

        for(var i=0; i < ids.length; i++) {
            players.push(new YT.Player('**yt**'+i, {
                height: '400',
                width: '596',
                videoId: $(ids[i]).attr('rel'),
                events: {
                    'onReady': onPlayerReady,
                    'onStateChange': onPlayerStateChange
                }
            }));
        }

      }

для этого:

var tag = document.createElement('script');
  tag.src = "**https://www.youtube.com/iframe_api**";
  var firstScriptTag = document.getElementsByTagName('script')[0];
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
  var players = new Array();
  function **onYouTubeIframeAPIReady()** {

    var ids = $('div.video div');

    for(var i=0; i < ids.length; i++) {
        players.push(new YT.Player('**player**'+i, {
            height: '400',
            width: '596',
            videoId: $(ids[i]).attr('rel'),
            events: {
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
            }
        }));
    }

  }