2013-03-07 92 views
0

我有一个html页面,通过在url中放置外部页面的链接访问 - 例如,在外部页面上访问元素

http://www.mydomain.com/mypage?external-page=encodedURL

这是我的网页有责任从它递给URL凑一些数据。

如何使用javascript/jquery访问传入的页面?我需要能够提取某些类和ID的内容。

这是违反同一来源政策吗?如果是这样,是否有其他方式来处理这样的外部页面?看起来很奇怪,我可以在浏览器或终端命令中打开网页并接收内容,但不能在js文件中。

回答

1

您可以使用浏览器扩展来抓取外部页面,然后将数据发送到您的站点,或者将其显示在页面中,以便可以通过DOM访问页面的JavaScript。

您可以在您的域名上使用代理来获取外部页面,并将其传递到您的域名上的JavaScript。

您可以将API用于可访问的外部页面。

你可以问,命令,改变外部页面的代码(如果您可以访问它)担任与网页访问控制允许来源= *

我觉得这是你能做的一切。

编辑:的“似乎有些奇怪”,直到你实现用户过程之间的预期差。用户不被认为是恶意的,但一个过程可能是。例如,一个进程可以从用户登录的gmail会话中获取数据(如果它有权访问外部页面),并将该数据传输到服务器。由于终端上的用户可能(但并非总是)登录该会话的用户,因此用户不会被认为是恶意的。但是,源自用户导航到的某个网站的脚本不应该能够以与该用户相同的权限执行操作。由于该脚本也是代理,并且可以执行操作,但不是由用户创建或定向的。这是孤立原产地和相同原产地政策的最强有力的理由。

小书签的执行上下文,和iframe中 如果您通过书签注入JS到每一个网页,该注入代码的行为就好像它具有相同起源的休息该页面或至少该页面的“顶部框架”。它将在顶层框架的相同上下文中执行。如果页面中嵌套了iframe,那么如果您的书签尝试注入到该页面,则会出现“不安全的尝试访问来自页面x的错误”错误。这是因为小书签的起源位于首页,顶层页面无法访问不同域的嵌套iframe。

所以,如果你想刮网站的某些部分是在顶部框架之下的iframe,您的书签将无法得到它。使用

传输数据的书签 如果你想利用一个网址,您的域名,然后从URL中获取数据,另一个域,则显示该数据传回在同一页上,您需要一种获取数据的方法。你可以使用书签,但流程仍然会涉及一些“用户帮助”。它会是这样的:

  1. 加载您的域的网页,D用户把一个URL放入一个输入框。点击提交。
  2. D上的JavaScript打开一个指向用户提供的url的新标签/窗口。
  3. 用户点击外部页面,收集所需的数据上的刮书签,X.
  4. 期望的数据,X,是通过Ajax发送到“服务器”,S,与会话标识符I.
  5. 页d,轮询服务器S,直到它得到通知,有些数据与会话标识符我已经抓住了,那么它得到的数据,并将其显示D.

有需要的服务器。您不能使用本地存储传输信息,因为这是特定于域的信息。有一种替代方案不需要服务器。它需要制作浏览器扩展。

使用浏览器扩展传输数据扩展的“背景页面”与所有浏览器选项卡的本地服务器基本相同,它允许跨目标到不同域的标签传输信息。这个设置中的“客户端”是“内容脚本”,它被加载到每个页面(就像书签一样,除非用户实际需要点击书签加载它。流程如下:

  1. Page D再次。用户在输入框中输入url。点击submit - >这会在扩展中触发一些代码。
  2. 扩展后台页面指示打开一个选项卡并将其定位到该URL。
  3. 内容脚本会自动加载到该选项卡中,并与后台检查应该获得的数据。它通过一条消息(一个json字符串)获取数据并将其发送到后台页面。
  4. 后台页面将该通知和数据推送到页面D上的原始内容脚本。其中显示信息。
  5. (可选)后台页面还会将信息传输到您的服务器以保存到该用户的数据存储中。

我用于浏览器扩展“背景页面”和“内容脚本”的语言非常专注于Google Chrome。 Safari,Firefox也有相同的概念。如果你想支持IE,你将不得不制定一些其他的东西。 IE10甚至不打算支持扩展。

+0

我建立一个书签,所以我的JS将在很页面我想刮运行(不幸的是我要加载自己的网页中进行身份验证的iFrame,所以我不能刮那里,然后)。此信息是否有利于您的任何方法?内容可能太长以至于无法追加到查询字符串 - 有没有其他方式可以根据您的第一个建议发送已删除的数据?谢谢你的解释。 – 2013-03-07 00:51:37

+0

@BenPackard有趣。 – 2013-03-07 01:45:57

1

如果外部页面和页面位于相同域,那么您应该可以使用JavaScript访问该外部页面。否则,JavaScript将不被允许访问外部网站,浏览器将阻止Cross-site scripting