跨子域ajax长轮询

3
我正在创建一个通知脚本,它会检查数据库中的更改并在JavaScript自定义弹出窗口中返回结果。
我已经成功地制作了jQuery ajax加载和处理脚本以及php长轮询页面。除了持久请求阻止任何其他ajax加载的内容之外,所有这些都非常出色。我发现解决方法是将其移动到不同的子域中。然而,这会导致js的“同源策略”问题,所有可能的解决方法似乎都无法与长连接速度或其他选项php代理一起使用,这违背了分离域名的初衷。
有没有人有什么想法或任何帮助。
谢谢
Oli
2个回答

0

你可以尝试的另一件事是填充的 JSON。你可以在某个 URL 上创建一个动态脚本,它接受 GET 参数,比如 sub.domain.com/jsonp.php?var=value,返回类似以下内容:

var response={a:1,b:2}

你可以动态加载一个带有该URL作为源的<script/>元素。在jsonp中设置的变量将可被其他脚本访问,并且不受SOP限制。


当收到响应时,是否能够调用事件? - Olirav
我猜这个脚本有一个onload事件,但这只是纯粹的推测。 - Kevin Dolan
不适用于彗星,因为在Chrome中它会显示持续的“加载”标志。 - Nir O.

0

没有简单的方法来解决这个问题...我找到的最简单的方法如下:

创建一个IFrame(是的,我知道),这个IFrame必须加载来自子域(sub.example.com/base)的页面

主页面和IFrame中加载的页面都必须将document.domain设置为'.example.com',然后您就可以:

  1. 从IFrame进行长轮询而不占用两个域连接之一
  2. 在主页面和IFrame之间进行通信,因此您可以将IFrame保留用于长轮询,然后调用父级的回调函数

这也解决了您以后可能遇到的另一个问题,即浏览器会一直旋转,直到第一个长轮询完成...


我查看了一些iframe的解决方案,但当我尝试使其工作时,加载圆圈总是出现,直到iframe加载完成,有没有办法隐藏这个反应? - Olirav
据我所知,如果长轮询是从IFrame中进行的,您不应该遇到旋转问题。尝试延迟长轮询的开始...在文档准备就绪事件中触发它。 - Fernando Diaz Garrido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接