繁体   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