2012-03-07 2 views
2

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

Так что у меня что-то вроде:

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

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

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

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

ответ

1

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

Работает отлично! Благодаря! –

+0

Добро пожаловать; рад помочь! –

1

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

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

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