Greasemonkey: ¿Pasar datos de cadena únicos a pestañas abiertas?

Creado en 7 nov. 2015  ·  10Comentarios  ·  Fuente: greasemonkey/greasemonkey

Ahora que GM_openInTab ya no devuelve el objeto de ventana y, por lo tanto, no podemos establecer variables de ventana desde el script que abre la ventana, ¿cómo se pueden pasar datos de cadena únicos a una pestaña, designada solo para esa pestaña?

Todos 10 comentarios

Consulte también https://github.com/greasemonkey/greasemonkey/issues/2134
(usado solo para contexto)

Eso simplemente confirma que GM_openInTab devuelve nulo, pero no hace referencia a mi caso de uso.

una solución alternativa sería agregar un ancla a la URL y hacer que un script procese ese ancla. Para cargas útiles más grandes, puede usar ese ancla como ID y luego usar canales de transmisión para que las pestañas se comuniquen entre sí.

Tenga en cuenta que el contenido web puede escuchar/manipular este tipo de canales de comunicación.

Evitaría las anclas por esa misma razón.

Puede usar el canal de comunicación de etiqueta GM_info.uuid con él.
Como script UUID único para script+computadora+perfil, es lo suficientemente seguro.
PD: No olvides // <strong i="8">@grant</strong> GM_info en el bloque de metadatos.

Parece que es para comunicarse entre diferentes scripts, no el mismo script ejecutándose en una página nueva.

@Sasstraliss ¿Por qué crees que "es para comunicarse entre diferentes guiones"? El script no puede obtener el UUID de un script diferente, solo el UUID del mismo.

Aquí hay un truco que aprendí de reddit. Una buena cantidad de pseudocódigo en lo que respecta a las variables, pero podría ayudar. Suponiendo que la ventana de destino y la ventana principal están en los sitios para los que es el script...

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 comillas inversas triples para mantener el formato de origen.

@the8472 dijo:

utilizar canales de difusión

Por desgracia, esta es una tecnología experimental que solo está disponible en Fx38+. Una solución más adecuada sería usar la API localStorage y los eventos de almacenamiento . consulte http://stackoverflow.com/questions/2236828/javascript-communication- between-tabs-windows-with-same-origin/12514384#12514384

¿Fue útil esta página
0 / 5 - 0 calificaciones