Javascript 与Greasemonkey&;子窗口
我有一个100%的客户端解决方案。我请求一个网页。将Greasemonkey(GM)脚本插入页面并重新组织页面(其中包含一个表)。该表现在具有javascript按钮,用于启动与每行相关的窗口,如下所示: //在父页面中:Javascript 与Greasemonkey&;子窗口,javascript,cross-browser,xss,greasemonkey,tampermonkey,Javascript,Cross Browser,Xss,Greasemonkey,Tampermonkey,我有一个100%的客户端解决方案。我请求一个网页。将Greasemonkey(GM)脚本插入页面并重新组织页面(其中包含一个表)。该表现在具有javascript按钮,用于启动与每行相关的窗口,如下所示: //在父页面中: var companyTable = data; // a table acquired with XMLHTTPRequest var chartCode = chartGenFunct.toString(); // funct to gen a chart inserte
var companyTable = data; // a table acquired with XMLHTTPRequest
var chartCode = chartGenFunct.toString(); // funct to gen a chart inserted by GM
var win = window.open('data:text/html;base64,'+ window.btoa(childWindow), '_blank');
其中,childWindow字符串包含:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>GM Script Info</title>
<style type="text/css"></style>
</head>
<body bgcolor="#FFFFFF">
<div id="companyTableDiv"></div>
<div id="companyChartDiv"></div>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script id="XXswScriptInitXX" type="application/javascript">
document.getElementById("companyTableDiv").innerHTML = window.opener.companyTable;
eval(window.opener.chartCode +"showTimeLine()"); // fills CompanyChartDiv
</script>
</body>
</html>
父窗口的omnibox所在位置:
http://somewebsite.com/table
这就是我所说的“Firefox中的一切都能正常工作”的要点。这不适用于带有Tampermonkey(TM)的Chrome。它不起作用的原因是Chrome阻止了它,因为根据错误控制台日志记录,这似乎是一个跨源资源共享问题:
未捕获的安全性错误:已从阻止原点为“null”的帧
访问原点为“”的帧。框架
请求访问的协议是“数据”,即正在访问的帧
有一个“http”协议。协议必须匹配
第行:
document.getElementById("companyTableDiv").innerHTML = window.opener.companyTable;
请记住,这是一个100%的客户端解决方案。我怎样才能骗Chrome让孩子看到开场白(家长)的数据?(我已经尝试插入document.domain=但这不起作用。)我遇到了同样的问题,但我想我知道一个解决方法,至少对于父窗口中最多5MB的静态数据,您可能希望子窗口访问这些数据。利用“”机制。打开子窗口时,同时将数据转储到本地存储。然后子窗口可以访问那里的数据,而不是试图直接从父窗口获取数据
请注意,如果在第一次“清除”所有内容后,多个网页想要保存某些内容,那么本地存储可能非常短暂!您的子窗口应该尽可能快地抓取整个数据块,然后故意删除它。如果父窗口在后台运行JavaScript,即使子窗口正在执行某些操作,它也可能会注意到删除,并将新的内容放入本地存储中,以便子窗口查找……我今天也遇到了同样的问题,我的工作解决方案是使用GM值 打开新窗口的方式将触发在其上运行相同的用户脚本。然后,您可以创建两个数据“流”:父数据流和子数据流 例如,这是侦听在父脚本部分中的外观:
var messageFromChild, childStreamControl;
childStreamControl = setInterval(function(){
messageFromChild = GM_getValue('childStream', 0);
if(messageFromChild != 0){
GM_deleteValue('childStream');
eval(messageFromChild);
}
}, 50);
广播:
// stream = [preparedMessage1, preparedMessage2...]
var ownStreamControl;
ownStreamControl = setInterval(function(){
if(GM_getValue('parentStream', 0) != 0 && stream.length > 0){
GM_setValue('parentStream', stream.unshift());
}
}, 50);
Thx——很有趣——大约在我意识到并测试这个的同时。我可以将同一页面的链接信息放在:window.open('),“_blank')--然后在子窗口中,由于我使用的是Greasemonkey,我可以覆盖整个页面,并使用通过window.opener.some_变量传递给子窗口的变量。这项技术似乎很有效。我仍然在微调,我认为它现在也应该在Chrome中工作。尽管如此,我最初的问题仍然有待其他人收集信息。不幸的是,我希望我的子页面不仅仅是访问父页面数据;我还想访问父页面上的函数和对象。这些东西不能通过本地存储传递。但是,我想尝试一个实验,如果它有效,我将发布它作为另一个答案。如果我检查DOM,我可以从opener窗口看到我的全局变量和代码。例如,函数main是window.opener.maincode。如果只使用select函数,您可以设置全局变量,如“var funkshun=mainPageFunction.toString()”,并且您的子页面可以通过window.opener.funkshun访问此主页代码。很抱歉,我不理解您最初的解释。“同一页面的链接信息”与原始父项和子项的关系如何?也就是说,在我看来你在谈论打开第三个窗口,那么前两个窗口中的哪一个正在打开,前两个窗口中的哪一个正在重新打开?在我的例子中,初始页面需要做一些安全的事情,但完成后,它就不需要再安全了(我希望有办法关闭它!)。初始页面生成的子页面都不需要安全性,但它们确实需要访问初始/父页面上的内容。啊-我的情况。。。页面somesite.com/example.pl显示了一个页面,该页面被发布回自身,并绘制了一个具有相同URL的不同页面。在与您讨论时,我使用了“同一页”。相反,考虑“同一页”是指同一站点/域上的任何页面(SoMeSIT.com)。为了避免CORS限制,当从该站点返回任何页面时,只需通过查找window.opener父全局变量(如chldWin if(window.opener){if(window.opener.chldWin){//my-global-parent-document.body.innerHTML=window.opener.chldWin);
// stream = [preparedMessage1, preparedMessage2...]
var ownStreamControl;
ownStreamControl = setInterval(function(){
if(GM_getValue('parentStream', 0) != 0 && stream.length > 0){
GM_setValue('parentStream', stream.unshift());
}
}, 50);