Greasemonkey: Passando dados de string exclusivos para guias abertas?

Criado em 7 nov. 2015  ·  10Comentários  ·  Fonte: greasemonkey/greasemonkey

Agora que GM_openInTab não retorna mais o objeto window e, portanto, não podemos definir variáveis ​​de janela a partir do script que abre a janela, como alguém pode passar dados de string exclusivos para uma guia, designada apenas para essa guia?

Todos 10 comentários

Veja também https://github.com/greasemonkey/greasemonkey/issues/2134
(usado apenas para contexto)

Isso simplesmente confirma que GM_openInTab retorna null, mas não faz referência ao meu caso de uso.

uma solução alternativa seria adicionar uma âncora à URL e ter um processo de script que ancorasse. Para cargas maiores, você pode usar essa âncora como ID e, em seguida, usar canais de transmissão para que as guias conversem entre si.

Observe que o conteúdo da web pode ouvir/manipular esses tipos de canais de comunicação.

Eu evitaria âncoras por isso mesmo.

Você pode usar o canal de comunicação do rótulo GM_info.uuid com ele.
Como script UUID exclusivo para script + computador + perfil, é seguro o suficiente.
PS: Não esqueça de // <strong i="8">@grant</strong> GM_info no bloco de metadados.

Parece que é para comunicação entre scripts diferentes, não o mesmo script sendo executado em uma nova página.

@Sasstraliss Por que você acha que "é para comunicação entre scripts diferentes"? O script não pode obter UUID de script diferente - apenas UUID do mesmo.

Aqui está um truque que aprendi no reddit. Uma boa quantidade de pseudocódigo no que diz respeito às variáveis, mas pode ajudar. Supondo que a janela de destino e a janela pai estejam em sites, o script é para...

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 , use aspas triplas para manter a formatação da fonte.

@the8472 disse:

usar canais de transmissão

Infelizmente, esta é uma tecnologia experimental disponível apenas em Fx38+. Uma solução mais apropriada seria usar a API localStorage e eventos de armazenamento . consulte http://stackoverflow.com/questions/2236828/javascript-communication-between-tabs-windows-with-same-origin/12514384#12514384

Esta página foi útil?
0 / 5 - 0 avaliações