Greasemonkey: Passer des données de chaîne uniques aux onglets ouverts ?

Créé le 7 nov. 2015  ·  10Commentaires  ·  Source: greasemonkey/greasemonkey

Maintenant que GM_openInTab ne renvoie plus l'objet window et que nous ne pouvons donc pas définir de variables de fenêtre à partir du script qui ouvre la fenêtre, comment peut-on transmettre des données de chaîne uniques à un onglet, désigné uniquement pour cet onglet ?

Tous les 10 commentaires

Voir aussi https://github.com/greasemonkey/greasemonkey/issues/2134
(utilisé uniquement pour le contexte)

Cela confirme simplement que GM_openInTab renvoie null, mais ne fait pas référence à mon cas d'utilisation.

une solution consisterait à ajouter une ancre à l'URL et à faire en sorte qu'un script traite cette ancre. Pour les charges utiles plus importantes, vous pouvez utiliser cette ancre comme ID, puis utiliser les canaux de diffusion pour que les onglets se parlent.

Notez que le contenu Web peut écouter/manipuler ces types de canaux de communication.

J'éviterais les ancres pour cette raison.

Vous pouvez utiliser le canal de communication d'étiquette GM_info.uuid avec lui.
En tant que script UUID unique pour script + ordinateur + profil, il est suffisamment sûr.
PS : N'oubliez pas de // <strong i="8">@grant</strong> GM_info dans le bloc de métadonnées.

On dirait que c'est pour communiquer entre différents scripts, pas le même script s'exécutant sur une nouvelle page.

@Sasstraliss Pourquoi pensez-vous que "c'est pour communiquer entre différents scripts" ? Le script ne peut pas obtenir l'UUID d'un script différent - uniquement l'UUID du même.

Voici une astuce que j'ai apprise sur reddit. Une bonne quantité de pseudocode en ce qui concerne les variables, mais cela pourrait aider. En supposant que la fenêtre cible et la fenêtre parente se trouvent sur des sites, le script est destiné à...

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 , veuillez utiliser des guillemets triples pour conserver le formatage de la source.

@the8472 a dit :

utiliser les canaux de diffusion

Hélas, il s'agit d'une technologie expérimentale uniquement disponible dans Fx38+. Une solution plus appropriée consisterait à utiliser l'API localStorage et les événements de stockage . voir http://stackoverflow.com/questions/2236828/javascript-communication-between-tabs-windows-with-same-origin/12514384#12514384

Cette page vous a été utile?
0 / 5 - 0 notes