6

Zmodyfikowałem istniejącą aplikację AngularJS, która wyświetla listę klientów, dodając przycisk, który pozwala pobrać informacje o klientach jako vcard. Tworzę vcard w JavaScript bezpośrednio po kliknięciu. Pobieranie przycisku wywołuje następującą funkcję na kliknięcie z klientem-element jako argumentu:Odmowa zgody na kliknięcie linku w przeglądarce Internet Explorer 11

function transcodeToAnsi(content){ 
    var encoding = "windows-1252"; 
    var nonstandard = {NONSTANDARD_allowLegacyEncoding: true}; 
    return new TextEncoder(encoding, nonstandard).encode(content); 
} 

$scope.download = function(item) { 
    var filename = 'contact.vcf'; 
    var aId = "vcard"; 

    var content = createVCard(item); 
    var encoded = transcodeToAnsi(content); 

    var blob = new Blob([ encoded ], { type : 'vcf' }); 
    var url = (window.URL || window.webkitURL).createObjectURL(blob); 

    $("body").append('<a id="' + aId + '" href="' + url + '" download=' + filename + ' class="hidden"></a>'); 
    $timeout(function(){ 
    document.getElementById(aId).click(); 
    $("#" + aId).remove(); 
    }) 

    return false; 
} 

W createVCard funkcją po prostu utworzyć zawartość pliku jako ciąg, więc nie powinno wejść w problemie. Transkodowanie jest wykonywane przez tę bibliotekę: https://github.com/inexorabletash/text-encoding

Funkcja działa bez problemu w Firefoksie i Chrome, ale nie w IE11. Następujący błąd podano w konsoli:

Error: Permission denied 
at Anonymous function (http://***/Contacts2015/js/contacts.js:169:9) 
at Anonymous function (http://***/static/9bojdXAkdR8XdVMdSTxZAgzEwGWhHMwgpuONdU2Y8F4.js:14305:11) 
at completeOutstandingRequest (http://***/static/9bojdXAkdR8XdVMdSTxZAgzEwGWhHMwgpuONdU2Y8F4.js:4397:7) 
at Anonymous function (http://***/static/9bojdXAkdR8XdVMdSTxZAgzEwGWhHMwgpuONdU2Y8F4.js:4705:7) undefined 

Linia 169 jest to instrukcja funkcji powyżej: jest wyświetlany

document.getElementById(aId).click(); 

Ten sam błąd, gdy to stwierdzenie jest wejście w konsoli ręcznie.

Chciałbym docenić każdą podpowiedź na temat przyczyny, a nawet więcej dobrego rozwiązania.

EDIT

Poprawiono błąd linii i literówka.

+0

To może być problem, ponieważ dołączone do 'aId' link do DOM - mogłoby się okazać, że nie jest pewien, jak go usunąć ponownie. Proponuję rzucić okiem na usuwanie elementów dołączonych do DOM, być może to mogłoby pomóc. – Forest

+0

@Furze Przepraszamy, mój błąd. Wydrukowałem niewłaściwą linię ... Zmieniłem ją. –

+0

Spróbuj zmienić 'document.getElementById (aId) .click();' na '$ (" # "+ aId) .trigger (" kliknij ");'. – Forest

Odpowiedz

12

Nie można bezpośrednio otwierać obiektów typu blob w programie Microsoft IE. Musisz użyć window.navigator.msSaveOrOpenBlob. Jest też msSaveBlob, jeśli tego potrzebujesz.

$scope.download = function() { 
    //etc... logic... 
    var blob = new Blob([encoded], {type: 'vcf'}); 

    //for microsoft IE 
    if (window.navigator && window.navigator.msSaveOrOpenBlob) { 
     window.navigator.msSaveOrOpenBlob(blob, fileName); 
    } else { //other browsers 
     var a = document.createElement('a'); 
     a.style = "display:none"; 
     a.href = URL.createObjectURL(blob); 
     a.download = "filename.jpg"; 
     a.click(); 
    } 
} 

Ostatnia sprawa: poprzedni kod nie będzie działać na Firefox Firefox nie obsługuje click(). Można prototype jego zachowanie za pomocą tego fragmentu:

HTMLElement.prototype.click = function() { 
    var evt = this.ownerDocument.createEvent('MouseEvents'); 
    evt.initMouseEvent('click', true, true, this.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null); 
    this.dispatchEvent(evt); 
} 
+0

Dzięki za banda. To robi! –

+0

Dziękujemy! Próbuję rozwiązać coś podobnego przez wiele godzin. Aby to wiedzieć, firefox obsługuje teraz metodę .click w HTMLElement od wersji 5. –

Powiązane problemy