SCRIPT70:在 IE 中访问 iFrame 的权限被拒绝
Posted
技术标签:
【中文标题】SCRIPT70:在 IE 中访问 iFrame 的权限被拒绝【英文标题】:SCRIPT70: Permission denied Accessing iFrame in IE 【发布时间】:2013-08-07 23:17:16 【问题描述】:我在 IE 中通过隐藏的 iFrame 上传文件时遇到了一些问题。实际上文件上传工作正常,但我的 jQuery 代码显示成功对话框并将链接添加到表没有触发。使用 IE 开发人员工具,我发现了 SCRIPT70: Permission denied 错误消息。这在 Chrome 中运行良好,所以我不知道 IE 中的问题是什么。我应该提到我使用的是 IE10,所以我想这个问题也存在于以前版本的 IE 中。
基本上我要做的是使用隐藏的 iFrame 模拟 Ajax 之类的文件上传,因为我们必须支持旧版浏览器。当 iFrame 成功发布时,它的响应有一个 div,其中包含我读取然后解析的 JSON。 JSON 中的数据用于向用户显示一条消息,指示文件上传的状态,并通过在表格中添加一行来添加到页面的链接。但是在 IE 中,chechUploadResponse 函数甚至没有被触发。
$(document).ready(function()
$('#btnPrint').click(openPrintTimesheetWindow);
$('#date').change(postback);
$('#employee').change(postback);
$('#client').change(postback);
$('#btnUpload').click(uploadFile);
$("#uploadFrame").on("load", function ()
$('#uploadFrame').contents().find('#userFile').change(uploadFileChanged);
checkUploadResponse();
);
);
function postback()
$('#timesheetPrintFilter').submit();
function uploadFileChanged()
$('#ajaxBusy').show();
$('#uploadFrame').contents().find('#uploadForm').submit();
function uploadFile()
var employeeId = $('#init_employee').val();
var periodDate = $('#init_periodEndDate').val();
$('#uploadFrame').contents().find('#employeeId').val(employeeId);
$('#uploadFrame').contents().find('#periodEndDate').val(periodDate);
$('#uploadFrame').contents().find('#userFile').click();
function checkUploadResponse()
var response = $('#uploadFrame').contents().find('#uploadResponse').text();
if (response != null && response != '')
var response = jQuery.parseJSON(response);
if (response.status == "ERROR")
$("#dialog").html(response.message);
$("#dialog").dialog( buttons: "OK": function() $(this).dialog("close");, title: "Error" );
else
$("#dialog").html(response.message);
$("#dialog").dialog( buttons: "OK": function() $(this).dialog("close");, title: "Success" );
var url = response.url;
var tsaid = response.tsaid;
var name = response.name;
var row = '<tr id="tsaid-' + tsaid + '">' +
'<td valign="top" align="left">' +
'<a href="' + url + '">' + name + '</a>' +
'</td>' +
'</tr>';
$("#tsAttachment").append(row);
$('#ajaxBusy').hide();
隐藏 iFrame:
<form id="uploadForm" name="uploadForm" action="timesheet-upload.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="3145728" />
<input type="hidden" name="employeeId" id="employeeId" value="" />
<input type="hidden" name="periodEndDate" id="periodEndDate" value="" />
<input type="file" name="userFile" id="userFile" />
</form>
以下是发布后隐藏 iFrame 的示例响应
<div id="uploadResponse">"status":"SUCCESS","message":"Timesheet successfully uploaded","url":"uploads\/2013\/Aug\/1-49cd1c0217abf676505b349ec88bb5a42b1d5631e41232f08be3b0dced9f65e2.pdf","name":"How To Write A Cover Letter.pdf","tsaid":15</div>
<form id="uploadForm" name="uploadForm" action="timesheet-upload.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="3145728" />
<input type="hidden" name="employeeId" id="employeeId" value="" />
<input type="hidden" name="periodEndDate" id="periodEndDate" value="" />
<input type="file" name="userFile" id="userFile" />
</form>
【问题讨论】:
原来这可能是一个 jQuery 错误。我从 jQuery-1.9.1 升级到 jQuery-1.10.2,这似乎解决了我的问题。我在 jQuery 网站上为任何感兴趣的人发现了这个报告。希望这对遇到类似问题的人有所帮助。 bugs.jquery.com/ticket/13936 【参考方案1】:我知道这篇文章有点老了,但这可能有助于未来探索 IE 的谜团。
提出的解决方案需要应用到jQuery 库。 问题在这里解释: https://connect.microsoft.com/IE/feedback/details/802251/script70-permission-denied-error-when-trying-to-access-old-document-from-reloaded-iframe
这里给出了解决方案:
https://github.com/jquery/sizzle/blob/5b3048605655285a81b06fbe4f49f2a14a8d790f/src/sizzle.js#L472-L480
另一种解决方案位于 jQuery 错误报告站点的这张票下:http://bugs.jquery.com/ticket/14535 它由用户 muley 发布,并提供了一个 JSFiddle:http://jsfiddle.net/xqb4s/
本例需要添加到jQuery库中的代码为:
// MY EDIT - this try/catch seems to fix IE 'permission denied' errors as described here:
// http://bugs.jquery.com/ticket/14535
try
document === document; //may cause permission denied
catch(err)
document = window.document; //resets document, and no more permission denied errors.
下:
function Sizzle( selector, context, results, seed )
【讨论】:
这解决了我的问题并拯救了我的一天!我的情况是,一旦加载了内部文档,iframe 内的页面就会调用外部文档的基于 jquery 的函数,然后外部文档的 jquery 不再工作,只是抛出access is denied
错误。
document === document
行将被 JS uglify/minify 工具删除,还有其他触发权限拒绝的方法吗?谢谢。
我使用的是 jquery 2.2.4;找不到解决方案或找到此类代码。请提供此版本。以上是关于SCRIPT70:在 IE 中访问 iFrame 的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
在 IE 的嵌套 iframe 中访问 javascript 函数
IE7下iframe无法使用window.parent获取父元素中的变量值