Использование usercript GM_functions в контексте страницы - PullRequest
2 голосов
/ 07 марта 2012

Я хочу «заново связать» все на определенной странице через запрос XMLHTTP с доменом локальной сети. Это привело бы меня к GM_xmlhttpRequest в GreaseMonkey / NinjaKit, за исключением того, что я хочу запустить его , когда ссылка нажата, а не когда пользовательский скрипт фактически выполняется ...

Итак, у меня есть что-то вроде:

links = document.getElementsByTagName('a');
for (i = 0; i < links.length; i++) {
    oldhref = links[i].getAttribute('href');
    links[i].setAttribute('href', 'javascript:loadLink(' + oldhref + ')');
}

Я понимаю, что могу использовать unsafeWindow или добавить элемент script в документ для добавления loadLink функции.
Но как я могу использовать GM_xmlhttpRequest в loadLink ?

Я смотрел на страницу 0.7.20080121.0 Совместимость , но я не уверен, что это то, что мне нужно ...

Я также рассмотрел добавление iframe на страницу, и измененные ссылки будут загружаться в iframe (снова вызывая пользовательский скрипт), но я бы предпочел более чистое решение ...

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Вам почти никогда не нужно использовать функции GM внутри контекста страницы, и из кода, опубликованного до сих пор, вам также не понадобится unsafeWindow в этом случае.

Кроме того, нет необходимости переписывать href для того, что опубликовано до сих пор.

Что-то подобное выполнит то, что вы хотите:

var links = document.getElementsByTagName ('a');

for (var J = 0, len = links.length;  J < len;  ++J) {
    links[J].addEventListener ("click", myLoadLink,   false);
}

function myLoadLink (zEvent) {
    zEvent.preventDefault();
    zEvent.stopPropagation();

    var targetHref = zEvent.currentTarget.getAttribute ('href');

    GM_xmlhttpRequest ( {
        //wtv
    } );

    return false;
}


Или с помощью jQuery:

$("a").click (myLoadLink);

function myLoadLink () {

    var targetHref = $(this).attr ('href');

    GM_xmlhttpRequest ( {
        //wtv
    } );

    return false;
}
1 голос
/ 07 марта 2012

Хорошо, так что мне удалось заставить этот официальный обходной путь GreaseMonkey работать (не знаю, что я сделал неправильно в первый раз) с:

unsafeWindow.loadLink = function(href) {
    setTimeout(function(){
        GM_xmlhttpRequest({
            //wtv
        });
    },0);
}

Но я все равно предпочел бы решение без использования unsafeWindow если есть ... (тем более что этот неправильный ...)

...