更新:新方法
在下面与 Gili 讨论之后,解决方案跨多个页面工作的要求让我重新考虑了我的解决方案。
新方法:
- 不需要目标站点上的任何代码更改或特定功能。
- 在用户导航时在每个页面上工作(只要他们留在同一个域中)
- 可以调整以将任何 HTML/JS 注入任何目标页面中的任何 DOM 元素
我的解决方案如下:
- 将您想要演示 Widget X 的人发送到一封电子邮件,其中包含指向您的说明页面的链接
- 该说明页面包含一个书签,他们将其添加到书签栏中
- 他们访问自己的网站并单击您的书签
- 您的书签将 javascript 注入他们的页面
- 该 javascript 创建一个弹出窗口,其内容似乎属于目标域,因为该域生成了弹出窗口
- 然后,该弹出窗口监视目标浏览器窗口 (window.opener) 上的 DOM,并在当前页面不包含我们的目标节点 ID 时注入我们的任意 HTML。
它似乎在我的测试中运行良好(在 Chrome 中完美,尚未在所有浏览器上测试)并且似乎适用于从 StackOverflow 到 Twitter 的每个目标站点。
现场演示:如何在第三方网站上演示 Web 小部件而无需访问其代码
下面的示例代码,为了便于阅读而扩展:
s = "<script type='text/javascript'>setInterval(function() { if(!window.opener.document.getElementById('gctrlPixelator')) {var i=document.createElement('IMG');i.src='//lorempixel.com/400/200/';i.id='gctrlPixelator';i.style.cssText='top:20;right:20;position:absolute;z-index: 9999;';window.opener.document.getElementsByTagName('body')[0].appendChild(i);}},500);</script>";
t = "<div style='text-align: center; font-family: Arial, Helvetica;'><h1 style='font-size: 18px;'>Demo running!</h1> Keep this window open and return to the main site window to continue the demo.</div>";
w = window.open('','name','height=200,width=400');
w.document.write(s);
w.document.write(t);
在部署到潜在客户的“说明”登录页面之前,应将上述内容转换为书签。
原始解决方案
首先,很抱歉将其发布为答案而不是评论。我已经考虑了半个小时,才意识到我需要 50 声望才能发表评论。所以,很抱歉,但我想分享...
我同意不太可能有跨浏览器的方式来执行这种双 iframe 技巧。我阅读了您关于 javascript URL 重写的另一个问题,它让我想到了一个想法:与其尝试在另一个 URL 上嵌入/劫持他们的网站,不如创建一个允许您将 Javascript 注入他们的页面的书签?
它可以像这样工作:
- 将他们引导到您托管自定义书签链接的站点。要求他们将其添加到他们的收藏夹中。
- 请他们访问他们自己的网站,然后在他们的书签中单击您的书签。
- 这会将您的 JS 注入他们的页面,允许您以任何您想要的方式编辑 DOM(例如更改样式、添加 DOM 元素等)
像这样的代码,转换为书签(即包装在一个带有javascript的函数中:在开始时)可以做到这一点......
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", "http://www.example.com/file.js");
document.getElementsByTagName("head")[0].appendChild(script);
我已经在 Chrome 中测试过,似乎很高兴加载 JS 跨域。唯一的规则似乎是协议必须匹配(http 或 https)。
不是你要求的,而是一个可能的解决方案。