Greasemonkey: Melewati data string unik ke tab yang dibuka?

Dibuat pada 7 Nov 2015  ·  10Komentar  ·  Sumber: greasemonkey/greasemonkey

Sekarang GM_openInTab tidak lagi mengembalikan objek jendela, dan dengan demikian kita tidak dapat mengatur variabel jendela dari skrip yang membuka jendela, bagaimana seseorang dapat meneruskan data string unik ke tab, yang ditujukan hanya untuk tab itu?

Semua 10 komentar

Lihat juga https://github.com/greasemonkey/greasemonkey/issues/2134
(digunakan hanya untuk konteks)

Itu hanya mengonfirmasi bahwa GM_openInTab mengembalikan nol, tetapi tidak merujuk ke kasus penggunaan saya.

satu solusi adalah dengan menambahkan jangkar ke URL dan memiliki proses skrip jangkar itu. Untuk muatan yang lebih besar, Anda dapat menggunakan jangkar itu sebagai ID dan kemudian menggunakan saluran siaran agar tab saling berbicara.

Perhatikan bahwa konten web dapat mendengarkan/memanipulasi saluran komunikasi semacam ini.

Saya akan menghindari jangkar karena alasan itu.

Anda dapat menggunakan saluran komunikasi label GM_info.uuid dengannya.
Karena skrip UUID unik untuk skrip+komputer+profil, itu cukup aman.
PS: Jangan lupa // <strong i="8">@grant</strong> GM_info di blok metadata.

Kedengarannya seperti itu untuk berkomunikasi antara skrip yang berbeda, bukan skrip yang sama yang berjalan di halaman baru.

@Sasstraliss Mengapa menurut Anda "ini untuk berkomunikasi antara skrip yang berbeda"? Skrip tidak bisa mendapatkan UUID dari skrip yang berbeda - hanya UUID yang sama.

Inilah trik yang saya pelajari dari reddit. Cukup banyak pseudocode sejauh menyangkut variabel, tetapi mungkin membantu. Dengan asumsi jendela target dan jendela induk ada di situs, skrip ini untuk ...

var stringData;

var awakener = window.opener || window.parent;
if(awakener && awakener != window)
{
    //Used when a page is launched from a link so that passData can...well...pass data. But we can't use onload from there so instead we're using postMessage here to convey to the "parent" window that this window is ready to recieve data
    awakener.postMessage("Loaded","*");
}

window.addEventListener("message", messageDetected, false);

clickableThing.onclick = function() {
    var newWindow = window.open(this.href,this.target);
    passData(window,newWindow,dataToPass);
    return false;
};

function messageDetected(event)
{
    if(typeof(event.data) == "string" && event.data != "Loaded")
    {
        stringData = event.data;
    }
}

function passData(mainWindow,target,data)
{
    mainWindow.addEventListener("message", passItOn, false);
    function passItOn(event)
    {
        if(event.source == target) target.postMessage(data,"*");
    }
}

@DoomTay , silakan gunakan tiga tanda kutip untuk menjaga pemformatan sumber.

@the8472 berkata:

gunakan saluran siaran

Sayangnya, ini adalah teknologi eksperimental yang hanya tersedia di Fx38+. Solusi yang lebih tepat adalah menggunakan API penyimpanan lokal dan acara penyimpanan . lihat http://stackoverflow.com/questions/2236828/javascript-communication-between-tabs-windows-with-same-origin/12514384#12514384

Apakah halaman ini membantu?
0 / 5 - 0 peringkat