jQuery无法在我的Facebook应用程序中使用Internet Explorer - 访问被拒绝

Mar*_*rty 6 javascript jquery internet-explorer facebook-iframe

只花了大约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的存在触发的.

Mar*_*rty 14

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

  • SCRIPT5:访问被拒绝.

在尝试了我在互联网上发现的十几件事(以及那些的组合)之后,我决定使用非缩小版的jQu​​ery,以便我可以更准确地确定导致我的问题的那一行.上传后再在控制台中查看,我被指向第1513行,看起来像这样:

if ( parent && parent.frameElement ) {
Run Code Online (Sandbox Code Playgroud)

在这一行上面是一条评论,其中记录了我遇到的问题:

// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
Run Code Online (Sandbox Code Playgroud)

我用Google搜索jQuery #13936遇到了这个页面,这表明我将以上行换成:

if ( parent && parent.attachEvent && parent !== parent.top ) {
Run Code Online (Sandbox Code Playgroud)

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

  • 问题在10.1.2中得到修复.错误#13980.http://blog.jquery.com/2013/07/03/jquery-1-10-2-and-2-0-3-released/ (2认同)