![](/img/trans.png)
[英]How do I reload a Greasemonkey script when AJAX changes the URL without reloading the page?
[英]How do I “quietly” reload a page from a Greasemonkey script?
我想重新加載頁面,以免引起全頁刷新的影響,例如在頁面的選項卡上顯示“正在加載...”。
這是我到目前為止的代碼。 我的理論是我可以用<frame>
包裹的更新站點版本覆蓋body
部分,該版本是通過GM_xmlhttpRequest
獲得的。
setInterval(reload, 10000);
function reload() {
GM_xmlhttpRequest({method: 'GET',
url: location.href,
onload: function(responseDetails) {
document.body.innerHTML =
'<frame>\n'
+ responseDetails.responseText
+ '</frame>\n';
}});
}
在stackoverflow.com上使用Firebug進行測試時,我發現此腳本將更新body
就像執行了整頁刷新一樣 ,而沒有副作用。 好極了! 神秘地,找不到<frame>
標簽。
我現在擁有的內容可以很好地重新加載頁面,但是我有兩個問題:
body
沒有<frame>
標簽? 到目前為止,我已經結合了Cleiton,Havenard和Henrik的答案中的內容。 我嘗試通過通過GM_xmlhttpRequest
發送的數據中的header: { 'Cookie': document.cookie }
發送GM_xmlhttpRequest
。 這發送了一些但不是全部的cookie。 事實證明,如果我在Firefox中打開第三方cookie,那么我將獲得必要的額外cookie( .ASPXAUTH
, ASP.NET_SessionId
和user
),但這不是一個好主意 。
document.body.innerHTML =
responseDetails.responseText.match(/<body>([\s\S]*)<\/body>/i)[1];
更新:對於具有屬性的<body>:
document.body.innerHTML =
responseDetails.responseText.match(/<body[^>]*>([\s\S]*)<\/body>/i)[1];
@安德魯·基頓(Andrew Keeton),
首先在您的計算機中安裝提琴手 ,然后查看是否將GM_xmlhttpRequest發出的http請求與所有 cookie一起發送。 如果不是,請轉到about:config選項“ network.cookie.cookieBehavior”並將其設置為0,然后執行另一項測試。 如果可行。 您會遇到麻煩,因為沒有安全的方法可以使用油脂猴子執行此更改,並且您將不得不使用@Henrik棘手的問題。
至於登錄狀態,我希望可以通過某種形式的會話cookie對其進行跟蹤。 確保在GM_xmlhttpRequest標頭中明確設置它們,因為它本身不是這樣做的。
現在不確定確切的語法,但是應該是這樣的:
GM_xmlhttpRequest({method: 'GET',
url: location.href,
headers: {'Cookie': document.cookie},
onload: function(responseDetails) { ...
您要在哪些網站上進行此操作?
根據您的需要,如果更容易/更好地更改它們給您的Cookie的超時時間,您可以永久設置自己的過期時間:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.