Greasemonkey + jQuery: использование GM_setValue() в обратном вызове события

Я пытаюсь установить данные в долгосрочное хранилище в скрипте GreaseMonkey, за исключением того, что GM_setValue(), похоже, не работает молча:

$("a#linkid").click(function()
{
    GM_setValue("foo", 123); // doesn't work, but does not generate error
});

GM_setValue("bar", 123); // works properly, value is set

person Luke Dennis    schedule 13.05.2009    source источник


Ответы (3)


Я думаю, что это конкретная проблема безопасности Greasemonkey. См. раздел 0.7.20080121.0. GM не разрешает пользовательским страницам вызывать API GreaseMonkey, и это то, что вы там делаете (вы регистрируете обработчик кликов с JQuery, работающим в контексте пользователя). Обходной путь также приведен на этой странице.

person Matthew Flaschen    schedule 14.05.2009
comment
Хм, я не понимаю, почему они, кажется, думают, что это исправление безопасности помогло? По сути, они не просто заполнили систему безопасности, а затем все равно рассказали всем, как ее взломать, и теперь для этого нам приходится использовать запутанный код. В любом случае, спасибо, я собирался спросить, как вызвать GM_setValue() из веб-страницы, и это всплыло, так что избавил меня от проблем. - person Jonathon; 24.05.2011
comment
Мне интересно, работает ли это только потому, что все значения предопределены, или это сработает: unsafeWindow.someObject.registerCallback(function(key, value) { setTimeout(function(key, value) { GM_setValue(key, value); }, 0); }); - person Jonathon; 24.05.2011
comment
@JonathonWisnoski Проблема заключается не в законных сценаристах, а в создателях вредоносных веб-сайтов, которые потенциально могут внедрить GM_getvalue() на свой сайт и вывести ваши личные данные (или подделать запросы AJAX и выдать себя за вас на сайтах, где ваш браузер имеет активный сеанс). Обходной путь возможен только начиная с повышенного (внестраничного) контекста. - person Basic; 12.05.2017

У меня была такая же проблема...

Предыдущее решение не работало для меня, и я нашел такое решение...

function gmGet(name) {
    var theValue = GM_getValue(name);
    return theValue;
}

function gmSet(name, valuee) {
    GM_setValue(name, valuee);
}

$("a#linkid").click(function(){
    //setValue
    gmSet("foo", 123);

   //getValue
   gmGet("foo");
});
person Shakil    schedule 18.02.2012

Вы можете использовать это решение.

$("a#linkid").click(function()
{
    //setValue
    setTimeout(GM_setValue("foo", 123),0);

   //getValue
   setTimeout(GM_getValue("foo"),0);
});
person Rady    schedule 21.07.2010
comment
Хороший трюк, на самом деле. Хотя я думаю, что вы имели в виду /*setValue*/ и /*getValue*/, код, который вы разместили, на самом деле не запустится. ;) - person Luke Dennis; 23.07.2010