Использование usercript GM_functions в контексте страницы

Я хочу "заново связать" все на определенной странице через XMLHTTPRequest с доменом локальной сети. Это привело бы меня к 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 ответа

Решение

Вам почти никогда не нужно использовать функции 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;
}

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

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

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

Другие вопросы по тегам