Greasemonkey: Передача уникальных строковых данных на открытые вкладки?

Созданный на 7 нояб. 2015  ·  10Комментарии  ·  Источник: greasemonkey/greasemonkey

Теперь, когда GM_openInTab больше не возвращает объект окна, и, следовательно, мы не можем устанавливать переменные окна из скрипта, открывающего окно, как передать уникальные строковые данные на вкладку, предназначенную только для этой вкладки?

Все 10 Комментарий

См. также https://github.com/greasemonkey/greasemonkey/issues/2134 .
(используется только для контекста)

Это просто подтверждает, что GM_openInTab возвращает null, но не ссылается на мой вариант использования.

одним из обходных путей было бы добавить привязку к URL-адресу и обработать эту привязку сценарием. Для больших полезных нагрузок вы можете использовать этот якорь в качестве идентификатора, а затем использовать широковещательные каналы , чтобы вкладки общались друг с другом.

Обратите внимание, что веб-контент может прослушивать/манипулировать такими каналами связи.

Я бы избегал якорей именно по этой причине.

Вы можете использовать с ним канал связи метки GM_info.uuid .
Поскольку UUID скрипта уникален для скрипта+компьютера+профиля, это достаточно безопасно.
PS: Не забудьте // <strong i="8">@grant</strong> GM_info в блоке метаданных.

Похоже, это для связи между разными сценариями, а не для одного и того же сценария, работающего на новой странице.

@Sasstraliss Как вы думаете, почему «это для общения между разными скриптами»? Скрипт не может получить UUID другого скрипта — только тот же UUID.

Вот трюк, который я узнал из Reddit. Изрядное количество псевдокода в отношении переменных, но это может помочь. Предполагая, что целевое окно и родительское окно находятся на сайтах, для которых предназначен скрипт...

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 , пожалуйста, используйте тройные обратные кавычки, чтобы сохранить исходное форматирование.

@the8472 сказал:

использовать широковещательные каналы

Увы, это экспериментальная технология, доступная только в Fx38+. Более подходящим решением будет использование localStorage API и событий хранилища . см. http://stackoverflow.com/questions/2236828/javascript-communication-between-tabs-windows-with-same-origin/12514384#12514384

Была ли эта страница полезной?
0 / 5 - 0 рейтинги