我有100%的客户端解决方案。我提出了一个网页请求。 Greasemonkey(GM)脚本被插入页面&重新组织页面(包含一个表)。该表现在具有带有javascript的按钮,以启动与每行相关的窗口,如下所示:
//在父页面中:
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>
来自上述父母&amp;子代码,你可以看到的想法是将window.opener.chartCode和window.opener.companyTable传递给打开的子窗口。子窗口的多功能框看起来像:
data:text/html;base64,PCFET0NUWVBFIGh0bWwgU...
父窗口的多功能框所在的位置:
http://somewebsite.com/table
这就是我说“一切都在Firefox中运行”的地方。这不适用于使用Tampermonkey(TM)的Chrome。它不起作用的原因是Chrome会根据错误控制台日志记录阻止它,因为它似乎是一个跨源资源共享问题:
Uncaught SecurityError:阻止来自“null”的原始帧 访问原点为“http://somewebsite.com”的框架。框架 请求访问具有“数据”协议,正在访问该帧 有一个协议“http”。协议必须匹配。
在线:
document.getElementById("companyTableDiv").innerHTML = window.opener.companyTable;
请记住,这是一个100%的客户端解决方案。如何欺骗Chrome让孩子看到开场白(父母)的数据? (我已经尝试插入document.domain = http://somewebsite.com但这不起作用。)
答案 0 :(得分:1)
我今天遇到了同样的问题,我的工作解决方案是使用GM值。
以一种触发相同用户脚本的方式打开新窗口。然后你可以创建两个流&#39;数据:在父母和孩子的方向。
例如,这听起来如何在父脚本部分中显示:
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);
答案 1 :(得分:0)
我遇到了同样的问题,但我认为我知道一个解决办法,至少在父窗口中可能希望子窗口访问的最多5MB的静态数据。利用“local storage”机制。打开子窗口时,请同时对本地存储执行数据转储。然后子窗口可以访问那里的数据,而不是试图直接从父级获取数据。
请注意,本地存储可能非常短暂,如果在首先对所有内容进行“清除”后,多个网页想要保存一些东西!您的子窗口应该尽可能快地抓取整个数据块 - 然后故意删除它。如果父窗口在后台运行JavaScript,即使子窗口正在执行操作,它也可能会注意到删除,并将新内容放在本地存储中以供子窗口查找....