![](/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.