English 中文(简体)
将Javascript注入页面
原标题:
  • 时间:2009-04-07 20:24:14
  •  标签:

我正在写一个基于网络的游戏,包括点击互联网上各种网站的链接。我知道这听起来很奇怪,但基本前提是你从我的页面开始,点击另一个网站上某个页面的链接。您将继续关注链接,直到到达要访问的页面。想想WikipediaGame.org吧。不同的是,我无法控制带有链接的实际页面。

我需要做的是跟踪他们点击的所有链接,当他们到达最后一页时,我想把它们发回我的网站(或类似的东西)。

我当时想的是,也许我可以以某种方式拦截页面请求,并注入一些Javascript来跟踪他们点击的链接。这可能吗?有人做过这样的事吗?显然,这可能会带来安全风险。我还有其他选择吗?我想避免让用户收集所有链接的列表,然后将它们发布到我网站上的文本框中。

最佳回答

所以我想好了该怎么办。我用的是这样一个iframe:

<;iframe src=“谜题/继续谜题”/>

它将源指向我的Mvc控制器。在我的控制器中,我对我想要的实际url进行WebRequest,然后解析Html并在页面中粘贴我自己的javascript。这个页面的行为和外观与其他网站相似,但实际上它来自我的网站。

问题回答

也许是一个书签,可以将当前页面发送到您的网站?这样,用户就可以用最少的工作量完全控制共享的链接列表。

为了使这个跨浏览器兼容,我不确定是否有办法不为每个浏览器编写插件。但是,我也可能错了:-)

你可以尝试制作一个bookmarklet(当用户点击某个书签时运行的Javascript),但它不会在用户加载的每个页面上自动运行;用户必须点击它才能运行它。

如果你只想支持Firefox,你可以编写一个Greasmonkey脚本,在每个页面/站点上运行。但是,这将限制您的用户范围。

单独使用javascript是无法做到这一点的。您需要编写一个firefox插件,或者编写一个GM脚本。

我不确定你能否按照你预想的方式完成这件事。如果不写浏览器插件,我会看看像KeepVid这样的网站在做什么。他们让你在工具栏上创建一个书签,书签url是这样的:

javascript:document.location=http://keepvid.com/?url=+转义(window.location);

这基本上将用户当前所在的url传递给keepvid。如果你使用这个概念,你可以让你的用户点击书签按钮将该url注册给你,你可以收集它并将用户返回到他们原来的位置。

我不知道你会如何将JavaScript注入别人的页面,然后别人会向你发送消息。这听起来像是病毒会做的事情。

I think you could accomplish something like what you want using an iframe.
A simple method would be to include an iframe preset to load the “start” location on your site, and then include a button on the outer page for the user to post back their current location (in the iframe).

When the button on your page is pressed you could query the current state of the iframe…
References to the window generated by the iframe and to the document loaded into the iframe can be obtained via the frames array using the name attribute.

 window.frames[iframeName]  <br/>
 window.frames[iframeName].document  <br/>

引用的frames数组方法得到了广泛的支持,即使在相当旧的浏览器中也是如此,只要将name属性附加到iframe即可。为了获得最佳效果,请同时使用名称和id。

对于更新的浏览器,还可以通过iframe元素的contentWindow(IE win)和contentDocument(DOM)属性引用iframe中的文档:

// IE5.5+ windows
document.getElementById(iframeId).contentWindow
document.getElementById(iframeId).contentWindow.document
or,
// DOM 
document.getElementById(iframeId).contentDocument

编辑:正如下面的评论所示,看起来大多数浏览器都会阻止你以这种方式使用iframe。你可以在你想要的地方启动一个窗口,但如果它不在你的同一个域上,你就不允许与它通信。我想你可以构建一个“中间人”场景,首先通过服务器传输所有流量,但这并不实用。

下面是jQuery控制iframe的一个很好的例子

http://wwwendt.de/tech/dynatree/doc/sample-iframe.html

希望能有所帮助。





相关问题