如何“静静地”从Greasemonkey脚本重新加载页面?

时间:2009-08-19 01:44:27

标签: javascript html ajax greasemonkey

我想重新加载页面,这样就不会导致整页刷新的效果,比如在页面选项卡上显示“正在加载...”。

这是我到目前为止的代码。我的理论是,我可以使用body包装的更新网站版本覆盖<frame>部分,通过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. 有人可以解释为什么我的脚本有效吗?为什么<frame>中没有body个标签?
  3. 更新

    到目前为止,我已经收集了Cleiton,Havenard和Henrik的答案中的元素。我尝试通过header: { 'Cookie': document.cookie }发送的数据中的GM_xmlhttpRequest条目发送Cookie。这发送了一些但不是所有的cookie。事实证明,如果我在Firefox中启用第三方cookie,那么我将获得必要的额外cookie(.ASPXAUTHASP.NET_SessionIduser),但这是{{{ 3}}

4 个答案:

答案 0 :(得分:10)

document.body.innerHTML =
        responseDetails.responseText.match(/<body>([\s\S]*)<\/body>/i)[1];

更新:对于&lt; body&gt;具有属性:

document.body.innerHTML =
        responseDetails.responseText.match(/<body[^>]*>([\s\S]*)<\/body>/i)[1];

答案 1 :(得分:3)

@Andrew Keeton,

首先在您的计算机上安装fiddler,然后查看GM_xmlhttpRequest发出的http请求是否与所有 Cookie一起发送。如果没有去约:config选项“network.cookie.cookieBehavior”并将其设置为0,请做另一个测试。如果有效。你会遇到麻烦,因为没有一种安全的方法可以使用greasemonkey来执行这个改变,你将不得不使用@Henrik技巧。

答案 2 :(得分:1)

至于登录状态,我希望通过某种形式的会话cookie来跟踪它。确保在GM_xmlhttpRequest标头中明确设置它们,因为它本身不会这样做。

现在不确定确切的语法,但它应该是这样的:

GM_xmlhttpRequest({method: 'GET',
                url: location.href,
                headers: {'Cookie': document.cookie},
                onload: function(responseDetails) { ... 

答案 3 :(得分:0)

您要为此尝试使用哪些网站/网站?

根据您的需要,如果可能更容易/更好地更改他们给您的cookie的超时,您可以自己设置到期,永远:)