2016-10-17 3 views
7

У меня есть сценарий Greasemonkey, который должен отправлять postmessage во встроенный iframe, где тот же скрипт запускает функцию. Мое внимание направлено на легкое сообщение для запуска функции внутри iframe. Веб-сайт и iframe не находятся в одном домене. Мои навыки js довольно плохие, и я не могу найти проблему.Использование postmessage для связи с iframe - где ошибка?

Thx для чтения

// ==UserScript== 
// @name  Test 
// @namespace 
// @include  domainA 
// @include  domainB 
// @version  1 
// @grant  none 
// ==/UserScript== 

if ("domainA" === location.hostname) 
{ 
    if (window === top) // prevents the script from running twice on domain A 
    { 
    window.setTimeout(delay, 15000); 
    function delay() 
    { 
     console.log("Delay"); 
     document.getElementsByTagName("Iframe")[0].contentWindow.postMessage('message', 'domainB'); //The issue is probably here 
    } 
    } 
} 
else // domain B 
{ 
window.onmessage = function() // or here 
{ 
    console.log("Done"); // Didnt start 
} 
} 

редактирование: И с помощью Firefox

+0

Что вы используете для этого аргумента 'postMessage'? Это доменное имя или URL-адрес? Параметр origin должен быть 'http: // some.domain.com' (или подобным), а не' some.domain.com'. – Jacob

+0

Я использую 'https: // domain.com' –

ответ

3

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

Первый скрипт, который получает IFRAME и сообщения в него сообщение:

// ==UserScript== 
// @name  Test 
// @namespace 
// @include  domainA 
// @version  1 
// @grant  none 
// ==/UserScript== 

if (window === top) // prevents the script from running twice on domain A 
{ 
    window.setTimeout(delay, 15000); 
    function delay() 
    { 
    console.log("Delay"); 
    document.getElementsByTagName("Iframe")[0].contentWindow.postMessage('message', 'domainB'); //The issue is probably here 
    } 
} 

Второй сценарий, который соответствует домен фрейма и присоединяет обработчик событий:

// ==UserScript== 
// @name  Test IFrame 
// @namespace 
// @include  domainB 
// @version  1 
// @grant  none 
// ==/UserScript== 

if (window.addEventListener) 
{ 
    window.addEventListener("message", function (event) 
    { 
     console.log("Done"); 
    } 
} 
else // IE8 or earlier 
{ 
    window.attachEvent("onmessage", function (event) 
    { 
     console.log("Done"); 
    } 
} 
+0

Я пробовал, но получаю странную ошибку, если я добавлю свой код в свой' console.log («Delay»); 'не срабатывал, и, возможно, остальная часть код. –

+0

В Iframe есть встроенный проигрыватель videojs из openload.co –

0

К сожалению, у меня есть нет доступа к iframe html, поэтому я попытался добавить код скрипта с помощью Greasemonkey. Я нашел этот код в более старом вопросе о stackoverflow. Я чего-то не вижу. Есть ли способ проверить iframe для моего кода вставки?

Edit // Ok NVM rawframe.contentDocument не работает, если я добавить console.log("rawframe.contentDocument") в мой сценарий, он вернется NULL и script.text линия блокирует мое отверстие сценарий, если я закомментировать console.log("Delay") снова работает.

// ==UserScript== 
// @name  Test 
// @namespace 
// @include  https://domainA.com 
// @version  1 
// @grant  none 
// ==/UserScript== 
if (window === top) // prevents the script from running twice on domain A 
{ 
    var rawframe = document.getElementsByTagName("Iframe")[0]; 
    var framedoc = rawframe.contentDocument; // is NULL 
    if (!framedoc && rawframe.contentWindow) 
    { 
    framedoc = rawframe.contentWindow.document; 
    } 
    var script = doc.createElement('script'); 
    script.type = "text/javascript"; 
    script.text = "window.addEventListener("message", function (event) {console.log("Done");}"; 
    framedoc.body.appendChild(script); 

    window.setTimeout(delay, 15000); 
    function delay() 
    { 
    console.log("Delay"); 
    document.getElementsByTagName("Iframe")[0].contentWindow.postMessage('message', 'https://domainB.com'); 
    } 
} 
+0

Если вы разделили скрипты на две части и убедитесь, что Greasemonkey соответствует только их соответствующим доменам. Вы можете просто присоединить обработчик событий, не требуя, чтобы возиться с инъекцией любого JavaScript. Я обновил свой ответ, чтобы понять, что вы не контролируете iframe. – Steve