2016-10-17 14 views
7

Tôi có một tập lệnh Greasemonkey sẽ gửi một postmessage đến một iframe nhúng nơi cùng một kịch bản bắt đầu một hàm. Sự chú ý của tôi là gửi một thông điệp dễ dàng để kích hoạt một hàm bên trong khung nội tuyến. Trang web và khung nội tuyến không nằm trên cùng một tên miền. Kỹ năng js của tôi khá tệ và tôi không thể tìm ra vấn đề.Sử dụng postmessage để liên lạc với iframe - lỗi ở đâu?

Thx cho việc đọc

// ==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 
} 
} 

chỉnh sửa: Iam sử dụng Firefox

+0

Bạn đang sử dụng đối số 'postMessage' thứ hai nào? Có phải tên miền hoặc URL không? Tham số gốc phải là 'http: // some.domain.com' (hoặc tương tự) không phải' some.domain.com'. – Jacob

+0

Iam bằng cách sử dụng 'https: // domain.com' –

Trả lời

3

Tôi không tin bạn có thể làm điều này trong vòng một kịch bản. Nếu bạn tạo hai tập lệnh, nó sẽ hoạt động. Đảm bảo mỗi tập lệnh chỉ bao gồm một tên miền.

kịch bản đầu tiên mà được các iframe và viết thông điệp với nó:

// ==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 
    } 
} 

kịch bản thứ hai khớp với tên miền của iframe và gắn xử lý sự kiện:

// ==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

Tôi đã thử, nhưng tôi nhận được một lỗi lạ nếu tôi thêm mã của bạn' console.log ("Delay"); 'không kích hoạt và vì vậy có lẽ phần còn lại của mã. –

+0

Khung nội tuyến chứa trình phát videoj được nhúng từ openload.co –

0

Thật không may, tôi có không có quyền truy cập vào iframe html vì vậy tôi đã cố gắng thêm mã kịch bản với Greasemonkey. Tôi tìm thấy mã này trong một câu hỏi cũ hơn về stackoverflow. Có cái gì đó tôi mất tích. Có cách nào để kiểm tra iframe cho mã chèn của tôi không?

Sửa // Ok nvm rawframe.contentDocument không hoạt động nếu tôi thêm console.log("rawframe.contentDocument") để kịch bản của tôi nó trả về NULL và dòng script.text chặn kịch bản lỗ của tôi nếu tôi nhận xét nó ra console.log("Delay") hoạt động trở lại.

// ==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

Nếu bạn chia các tập lệnh thành hai và đảm bảo rằng Greasemonkey chỉ phù hợp với chúng với tên miền tương ứng của chúng. Bạn chỉ có thể đính kèm trình xử lý sự kiện mà không cần lộn xộn xung quanh bằng cách tiêm bất kỳ JavaScript nào. Tôi đã cập nhật câu trả lời của mình để phản ánh rằng bạn không có quyền kiểm soát iframe. – Steve

Các vấn đề liên quan