2013-08-06 84 views
5

Tôi đang gặp một số sự cố trong IE với việc tải tệp lên qua iFrame ẩn. Trên thực tế việc tải lên tệp đang hoạt động tốt nhưng mã jQuery của tôi để hiển thị hộp thoại thành công và thêm liên kết vào bảng không kích hoạt. Sử dụng các công cụ phát triển IE mà tôi đã phát hiện SCRIPT70: Cho phép thông báo lỗi bị từ chối. Điều này làm việc tốt trong Chrome vì vậy tôi đang thua lỗ với vấn đề trong IE. Tôi nên đề cập đến tôi đang sử dụng IE10 vì vậy tôi tưởng tượng vấn đề tồn tại trong các phiên bản trước của IE là tốt.SCRIPT70: Quyền bị từ chối Truy cập iFrame trong IE

Về cơ bản những gì tôi đang cố gắng làm là mô phỏng Ajax như tải lên tệp bằng iFrame ẩn vì chúng tôi phải hỗ trợ các trình duyệt cũ. Khi bài đăng iFrame thành công, câu trả lời của nó có một div chứa JSON mà tôi đọc rồi phân tích cú pháp. Dữ liệu từ JSON được sử dụng để hiển thị thông báo cho người dùng cũng cho biết trạng thái của tệp tải lên và thêm liên kết vào trang bằng cách thêm hàng vào bảng. Tuy nhiên trong IE chức năng chechUploadResponse thậm chí không xuất hiện để được bắn.

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(); 
} 

Hidden 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> 

Dưới đây là một phản ứng ví dụ từ iFrame ẩn sau khi được đăng tải

<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> 
+0

Hóa ra này có thể là một lỗi jQuery. Tôi đã nâng cấp từ jQuery-1.9.1 lên jQuery-1.10.2 và điều đó dường như giải quyết vấn đề cho tôi. Tôi thấy điều này được báo cáo trên trang web jQuery cho bất kỳ ai quan tâm. Hy vọng điều này sẽ giúp bất cứ ai có vấn đề tương tự. http://bugs.jquery.com/ticket/13936 – greyfox

Trả lời

8

Tôi biết bài này là một chút cũ , nhưng điều này có thể giúp những người tìm kiếm tương lai cho bí ẩn xung quanh IE.

Giải pháp được đề xuất cần được áp dụng cho thư viện của jQuery. Vấn đề được giải thích ở đây: https://connect.microsoft.com/IE/feedback/details/802251/script70-permission-denied-error-when-trying-to-access-old-document-from-reloaded-iframe

và các giải pháp được đưa ra ở đây:

https://github.com/jquery/sizzle/blob/5b3048605655285a81b06fbe4f49f2a14a8d790f/src/sizzle.js#L472-L480

Một giải pháp thay thế nằm dưới vé này tại trang web báo cáo lỗi jQuery: http://bugs.jquery.com/ticket/14535 Nó được đăng tải của thành viên muley và JSFiddle cũng được cung cấp: http://jsfiddle.net/xqb4s/

Mã cần được thêm vào trong jQuery thư viện trong trường hợp này là:

// 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. 
} 

Dưới sự:

function Sizzle(selector, context, results, seed) 
+0

Việc này đã giải quyết được vấn đề của tôi và đã lưu lại ngày của tôi! Kịch bản của tôi là, trang bên trong khung nội tuyến gọi hàm jquery dựa trên tài liệu bên ngoài khi một bên trong được nạp, sau đó jquery của tài liệu bên ngoài không hoạt động nữa, chỉ cần ném lỗi 'access is denied'. –

+0

Dòng 'document === document' sẽ bị xóa bởi công cụ JS uglify/minify, mọi cách khác để kích hoạt sự từ chối quyền? Cảm ơn. –

+0

Tôi đang sử dụng jquery 2.2.4; không thể tìm thấy giải pháp hoặc tìm mã như vậy. vui lòng cung cấp cho phiên bản này. –

Các vấn đề liên quan