jQuery / iframe无法在Chrome中运行

时间:2010-06-23 17:21:37

标签: jquery facebook google-chrome facebook-page

我在这里创建了一个facebook粉丝页面:

http://www.facebook.com/apps/application.php?id=120196931351044&v=app_120196931351044

它结合了iframe来调用某些使用jquery的页面/图片库。除Chrome之外,所有浏览器都能正常运行。 Chrome中的任何内容都不会出现在iframe中,只是空白背景。

我尝试使用load事件代替ready处理程序,但仍然没有运气 有没人见过铬中的类似问题?

非常感谢您的帮助。

标题中的大图片来自iframe,这是一个包含jquery的页面。

更新

如下面的评论所示,即使在Safari中它似乎也不起作用。

更新2

当在iframe外部运行时,相同的代码似乎在chrome中工作,这里是链接 到工作页面:

http://jsbin.com/esame4/4

更新3:

在使用iframe时,似乎这个问题在chrome中仍然存在,如下所示:

http://www.google.am/support/forum/p/Chrome/thread?tid=2c81c3e3fd99b388&hl=en
http://forums.sharethis.com/topic.php?id=2742

6 个答案:

答案 0 :(得分:4)

解决方案实际上很简单。要在您看到Facebook页面/应用时在Chrome中显示您的iframe内容,您必须从安全服务器调用内容或属性。

您必须确保所有必需的文件和文件夹(如CSS,JS和图像文件)都位于安全文件夹中。

  1. 为此,您需要为您的域提供SSL证书。

  2. 更改htaccess文件和mod重写条件以强制所有或特定文件夹使用SSL,尤其是在使用变量调用文件时。如果您使用的是绝对网址,请将其更改为https。

  3. 希望这有帮助!

答案 1 :(得分:2)

一些建议,主要与您在gallery.php页面上的Javascript设置有关:

我的第一直觉是说Chrome / WebKit处理跨站点脚本和其他类似潜在安全漏洞的方式是一个错误(甚至是预期的响应)。我知道一些安全漏洞涉及从iframe内部运行脚本(如this former Chrome bug所述)。

也许这与你从ajax.googleapis.com引用你的jquery.min.js而不是在与gallery.php页面相同的域上托管它有关。尝试将jquery.min.js的副本放在您的服务器上并链接到该服务器并查看它是否有帮助。

另外,请尝试将jQuery库<link>标记移到<head>标记内,因为这是一个更适合它的地方。

您也可以尝试使用jQuery Innerfade library来运行旋转横幅。它会清理你的脚本,谁知道,或许可以说服浏览器你没有试图利用安全漏洞。

如果您无法切换到使用Innerfade,请至少将JavaScript变量更改为不以$命名(例如,将“$ curbox”变量更改为“curbox”)。它可能会进一步澄清浏览器可能与您的Javascript混淆。至少,这是一种很好的做法,特别是在使用jQuery时。

答案 2 :(得分:2)

如果在iframe中没有调用document.ready是一个问题,因为此时已经加载了页面,是否可以将要加载的javascript放在新页面的底部而不是在document.ready中,一旦其他所有内容都被加载它就会加载? 我在某些页面上做了类似的事情,比如在页面顶部放置一些javascript来显示加载图像,在底部放置另一个块来隐藏它等等......

<html>
    <head><script>function pop(){alert("Page Loaded");}</script></head>
    <body>Lorum ipsum...</body>
    <script>pop();</script>
</html>

答案 3 :(得分:1)

嘿sAc,我在Chrome 5.0.375.86上尝试过它并且有效。由于safari和chrome使用相同的Web引擎(webkit),因此它可以继承同样的问题。由于它是一个javascript问题,现在chrome使用谷歌V8 javascript引擎而不是JavaScriptCore(来自webkit的默认javascript引擎),这个问题似乎在Chrome的最新版本中得到解决。也许它可能是JavaScriptCore上的一个问题,因为在构造iframe之前已经在文档上加载了DOM,所以不调度ready或load事件。可以设置临时解决方案以检查内容是否已初始化。使用setTimeOut放置一个5到10秒的计时器来检查此标志。如果未初始化,则在setTimeOut回调上调用它。因此,如果safari没有调用load或ready事件,setTimeOut可以为你做。当然,不要把它放在你的jquery层中。将其作为HTML中的纯javascript标记添加到iFrame中。

答案 4 :(得分:0)

检查您尝试放入iframe的页面中的响应标头。您正在寻找名为x-frame-options的标头。

这是一个新的安全选项,告诉浏览器不要加载帧内容。很多Web服务器都会默认添加它。

值得一试。

答案 5 :(得分:0)

不工作的原因是因为浏览器将iframe标记为不安全。 要解决此问题,只需在要显示的页面顶部添加一个字符集:

< head ><br/>
< meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"/><br/>
< /head><br/>