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?
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