Использование 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, если оно есть... (особенно если это кажется неправильным...)