6

刚刚花了大约 5 个小时来整理这个问题,所以我认为分享我如何克服它会对某人有所帮助并节省他们一些时间(这似乎是一个相当新的修复 - 在发布这个问题时 9 小时前 - 其中我在这里找到)。

我正在使用 jQuery 版本 1.10.1。

概述

我正在构建一个 Facebook 标签应用程序。这是一个竞赛报名表,访问者将在其中输入一些信息并上传他们在最近假期拍摄的照片。在嵌入 Facebook 之前,我的表单可以在所有浏览器中使用。

  • 表单是使用 提交的$.post()。jQuery 在此过程中指向的 PHP 脚本与表单本身位于同一域中。
  • 在您提交表单之前,您必须上传一个文件。文件上传过程是这样构建的:
    • 有一个<div>用作按钮。在这个 div 中,有一个<input type="file" />不透明度设置为 0 的字段。
    • 当点击不可见文件输入时,用户选择一个文件。
    • .change()选择文件后,将触发一个事件,并<div>显示文本“再次单击以上传”。我这样做而不是立即上传文件,因为在我的研究过程中,我了解到 Internet Explorer 不喜欢您在.change()附加到文件输入的处理程序中提交表单。
    • 当您再次单击 div 时,表单将通过.submit(). 该表单以隐藏的 iframe 为目标。文件正在上传,完成后 iframe 会触发一个.load()事件。
    • load 事件的处理程序用于.contents().find("div").html()获取我在管理文件上传的 PHP 脚本中发回的一些字符串化 JSON。JSON 包含文件上传的状态,以及处理成功的图像的 URL。

问题

该应用程序在嵌入到 Facebook时在除 Internet Explorer 之外的所有浏览器中都能正常工作。Internet Explorer 在控制台中给出了以下信息:

  • SCRIPT5:访问被拒绝。
  • SCRIPT5009:“$”未定义。

我首先研究了第二个错误,并遇到了我希望遇到并已经检查过的所有内容,例如:

  • 脚本路径错误。
  • 可能有一个 htaccess 文件阻止了对该文件的访问。
  • 脚本未正确加载,清除缓存等,然后重试。
  • 我试图在加载之前使用需要 jQuery 的脚本的可能性。

我已经仔细检查了所有这些并确认它们不是这种情况。然后我转向“拒绝访问”错误,我遇到的所有材料都指向有关使用 AJAX 的跨域请求的问题。也有一些文章特别提到了文件上传,但在这种情况下,没有任何与我 100% 相关的文章。

问题

当我尝试在嵌入 Facebook 的页面中使用 jQuery 时,为什么会在 Internet Explorer 中出现这些错误?即使我删除了页面上的所有其他脚本(jQuery 除外),我也得到了它们,所以我认为它是由我在页面上处理图像上传的隐藏 iframe 的存在触发的。

4

2 回答 2

14

首先,我删除了页面上的所有其他脚本,此时我只收到以下错误(显然是因为我不再尝试使用$):

  • SCRIPT5:访问被拒绝。

在尝试了我在互联网上找到的十几种东西(以及这些东西的组合)之后,我决定使用 jQuery 的非缩小版本,以便我可以更准确地确定导致我的问题的行。上传该文件并在控制台中再次查看后,我被指向第 1513 行,如下所示:

if ( parent && parent.frameElement ) {

这条线上方是一条评论,记录了我遇到的问题:

// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936

我用谷歌搜索jQuery #13936看到了这个页面,这表明我将上面的行替换为:

if ( parent && parent.attachEvent && parent !== parent.top ) {

进行此更改后,我很高兴发现问题已解决并且我的表单按预期工作。我再次检查了其他浏览器,可以确认它们仍然可以按预期工作。

于 2013-06-13T13:04:51.473 回答
1

解决了

这是一个合法的jQuery 1.10.1错误:http ://bugs.jquery.com/ticket/13980 。
使用jQuery 1.10.0, 或1.10.2不再发生错误。

于 2013-09-09T16:34:44.850 回答