网址跟踪功能

时间:2012-11-17 18:41:02

标签: javascript html webpage

我希望我的网页分为两部分。顶部有一个文本框。当用户在文本框中键入URL时,底部会浏览该URL的内容。当用户单击底部部分中的链接时,底部部分将导航到新URL,顶部的文本框将更改为新URL。我该怎么办?

注意:此行为与Google翻译中的行为相同(例如here),但没有任何翻译。

2 个答案:

答案 0 :(得分:1)

第一个问题..

同源问题

实现所要求的唯一方法就是谷歌翻译完成它的工作方式 - 即使用服务器端驱动的脚本作为代理请求:

  

http://translate.google.com/translate_un?depth=1&hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=en&twu=1&u=http://de.wikipedia.org/wiki/USA&lang=de&usg=ALkJrhgoLkbUGvOPUCHoNZIkVcMQpXhxZg

以上是从Google翻译用于显示翻译页面的iframe中获取的网址。需要注意的主要事项是,网址的域部分与父网页的网址http://translate.google.com相同 - 如果您的框架和父窗口共享同一个域,那么你的父窗口的JavaScript将无法访问iframe中的任何内容。它将被浏览器的内置安全性阻止。

显然,如果在你的项目中你只是要浏览你自己的网页(在同一个域名上),上面不会有问题,但考虑到你提供谷歌翻译作为一个例子我假设没有。

Google会做什么?

上述网址的作用是要求服务器端获取维基百科页面并将其返回,以便iframe可以显示它 - 但是对于iframe,此页面似乎托管在translate.google.com而非{ {1}}。这意味着iframe与父窗口保持在同一个源中,这意味着可以使用JavaScript编辑或修改iframe中的页面。

下一个问题....

重写代理内容

基本上我所说的是仅使用HTML和客户端JavaScript无法实现这一点 - 您需要从服务器端获得帮助,即PHP,Python,Ruby,Lisp,Node ..等等。此脚本将负责确保代理页面正确显示/呈现,例如您必须确保原始服务器上的content / images / css的相对链接未被破坏(您可以使用wikipedia标记或物理重写相对链接)。根据其网站的使用条款,还有许多网站将此视为非法使用其网站,因此应在您的服务中列入黑名单。

最后的问题..?

阻止用户脱离代理

获得代理脚本后,您可以使用iframe (请避免使用旧的框架集),以及baseonload的一些JavaScript魔法iframe重写页面中的所有链接,表单和按钮。这样,当单击或提交时,它们会发布到您的代理脚本而不是原始目标。此重写代码还必须将原始目标发送到您的代理脚本,例如Google翻译网址中的ondomready。在对此进行排序后,这意味着您的iframe将使用新的目标内容重新加载,但是 - 所有重要的是 - 您的iframe将保留在同一个域中。

问题太多了!

如果是我个人,我会重新考虑你的策略

总的来说,这不是一项简单的任务,也不是100%全面的,因为有很多事情会导致问题:

  1. 某些网站旨在打破框架。
  2. 用户可以通过无法轻松重写的页面进行导航,例如任何由JavaScript驱动的导航。
  3. 某些页面设计为在错误的主机上提供服务时中断。
  4. 对其他网站进行此类“代理”的网站可能会受到版权和使用方面的热议。
  5. 谷歌之所以能做到这一点,是因为他们有大量的时间,金钱和资源......哦,谷歌翻译的大部分内容实际上是在服务器端处理的 - 而不是用JavaScript。

    建议

    如果您正在寻找通过您自己的网站浏览的跟踪用户:

    • 使用Google Analytics。
    • 或使用cookie实现简单的服务器端跟踪系统。

    如果您希望跟踪访问您网站的用户,然后前往世界其他网络:

    • 放弃,网络技术旨在防止这样的事情发生。
    • 或者加入一家在线营销公司,他们会尽力避免这样的事情。

答案 1 :(得分:0)

在第二帧添加javascript函数 -

<frame id="dataframe" src="frame_a.htm" onload="load()">

让文本框有一个id - 说“test”

function load()
{
document.getElementById('test').value=document.getElementById('dataframe').src
}