2013-08-06 26 views
5

Gizli bir iFrame aracılığıyla dosyaları karşıya yüklerken IE'de bazı sorunlar yaşıyorum. Aslında dosya yükleme gayet iyi çalışıyor ancak jQuery kodumun başarı diyaloğunu göstermesi ve linke bir tablo eklememesi ateş etmiyor. IE geliştirici araçlarını kullanarak SCRIPT70'i keşfettim: İzin reddedildi hata mesajı. Bu, Chrome'da iyi çalışıyor, dolayısıyla sorunun IE'de ne olduğuna dair bir kayıp yaşıyorum. IE10 kullanıyorum bahsetmeliyim, bu yüzden sorunun IE'nin önceki sürümlerinde de olduğunu hayal ediyorum.SCRIPT70: İzin reddedildi IE'de iFrame'e erişme

Temelde, eski tarayıcıları desteklememiz gerektiğinden, saklı bir iFrame kullanarak Ajax dosya yüklemesini benzetmeye çalışıyorum. IFrame başarılı bir şekilde yanıt verdiğinde, okuduğum ve ayrıştırdığı JSON'u içeren bir div vardır. JSON'un verileri, kullanıcıya dosya yükleme durumunu da belirten bir mesajı görüntülemek ve tabloya bir satır ekleyerek sayfaya bağlantı eklemek için kullanılır. Ancak IE'de chechUploadResponse işlevi bile ateşleme gibi görünmüyor.

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

Gizli iFrame: Burada

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

Bu yazı biraz eski

<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

bu jQuery hata olmuş olabilir. JQuery-1.9.1 için jQuery-1.10.2 sürümüne yükselttim ve bu sorunun benim için çözüleceği görünüyordu. İlgilendiğim herkes için jQuery web sitesinde bunu bildirdim. Umarım bu, benzer sorunları olan herkese yardımcı olur. http://bugs.jquery.com/ticket/13936 – greyfox

cevap

8

biliyorum yayınlanmıştır sonra gizli iFrame bir örnek yanıttır Ancak bu, gelecekteki arayıcılara IE hakkında gizem için yardımcı olabilir.

çözüm önerilen ihtiyaçları jQuery kütüphane uygulanacak. Sorun burada açıklanmıştır: https://connect.microsoft.com/IE/feedback/details/802251/script70-permission-denied-error-when-trying-to-access-old-document-from-reloaded-iframe

ve çözüm burada verilmektedir:

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

alternatif bir çözüm jQuery hata raporlama yerinde bu bilet altında bulunur: Bu kullanıcı tarafından yayınlanmıştır http://bugs.jquery.com/ticket/14535 muley ve bir JSFiddle da sağlanır: http://jsfiddle.net/xqb4s/

Eklenmesi gereken kod Bu durumda jQuery kütüphanede:

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

altında: Bu çıkıyor

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

Bu, sorunumu çözdü ve günümü kurtardı! Benim senaryo, iframe içindeki sayfa iç belge yüklendikten sonra dış belgenin jquery tabanlı bir işlevini çağırıyor, sonra dış belgenin jquery'i artık çalışmıyor, sadece 'erişim engellendi' hatası atıyor. –

+0

'document === document' satırı JS inzivasyonu/küçültme aracı, izin reddini tetiklemenin alternatif yolları tarafından kaldırılacak mı? Teşekkürler. –

+0

jquery 2.2.4 kullanıyorum; çözümü bulamıyor veya bu kodu bulunamıyor. lütfen bu sürümü sağlayın. –

İlgili konular