5

我在 IE 中通过隐藏的 iFrame 上传文件时遇到了一些问题。实际上,文件上传工作正常,但我用于显示成功对话框并将链接添加到表的 jQuery 代码没有触发。使用 IE 开发人员工具,我发现了 SCRIPT70: Permission denied 错误消息。这在 Chrome 中运行良好,所以我不知道 IE 中的问题是什么。我应该提到我使用的是 IE10,所以我想这个问题也存在于以前版本的 IE 中。

本质上,我想做的是使用隐藏的 iFrame 模拟 Ajax 之类的文件上传,因为我们必须支持旧版浏览器。当 iFrame 成功发布时,它的响应有一个 div,其中包含我读取然后解析的 JSON。来自 JSON 的数据用于向用户显示一条消息,指示文件上传的状态,并通过在表中添加一行来添加到页面的链接。然而,在 IE 中, chechUploadResponse 函数甚至没有被触发。

Javascript:

$(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 width="80%" 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>
4

1 回答 1

10

我知道这篇文章有点老了,但这可能会帮助未来寻求 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 )
于 2014-10-20T15:17:33.640 回答