簡體   English   中英

如何從Greasemonkey腳本“安靜地”重新加載頁面?

[英]How do I “quietly” reload a page from a Greasemonkey script?

我想重新加載頁面,以免引起全頁刷新的影響,例如在頁面的選項卡上顯示“正在加載...”。

這是我到目前為止的代碼。 我的理論是我可以用<frame>包裹的更新站點版本覆蓋body部分,該版本是通過GM_xmlhttpRequest獲得的。

reloader.js

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>標簽。

問題

我現在擁有的內容可以很好地重新加載頁面,但是我有兩個問題:

  1. 重新加載后如何保持登錄狀態? 具體來說,我該怎么做才能保持登錄到Stack Overflow?
  2. 有人可以解釋為什么我的腳本有效嗎? 為什么body沒有<frame>標簽?

更新

到目前為止,我已經結合了Cleiton,Havenard和Henrik的答案中的內容。 我嘗試通過通過GM_xmlhttpRequest發送的數據中的header: { 'Cookie': document.cookie }發送GM_xmlhttpRequest 這發送了一些但不是全部的cookie。 事實證明,如果我在Firefox中打開第三方cookie,那么我將獲得必要的額外cookie( .ASPXAUTHASP.NET_SessionIduser ),但這不是一個好主意

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM