6

カスタマー情報をvcardとしてダウンロードできるボタンを追加することで、顧客をリストアップする既存のAngularJS-Appを修正しました。 Javascriptでvcardをクリックして直接作成します。それが問題に入るべきではありませんので、私は単なる文字列としてファイルのコンテンツを作成createVCard機能で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; 
} 

:ダウンロードボタンは、引数として、顧客項目でクリックで次の関数を呼び出します。トランスコードはこのライブラリで行います:https://github.com/inexorabletash/text-encoding

この機能はFirefoxとChromeでは問題なく動作しますが、IE11では動作しません。次のエラーがコンソールに与えられている:このステートメントを手動コンソールに入力された場合、同じエラーが表示され

document.getElementById(aId).click(); 

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 

ライン169上の関数のこの命令です。

私はその理由と、さらに良い回避策についてのヒントをいただきたいと思います。誤差線と誤植を修正

EDIT

+0

あなたがDOMに 'aId'リンクを追加ので、これは問題になるかもしれない - 再びそれを削除する方法がわからないことが考えられます。私はDOMの追加要素を削除してみることをお勧めします。 – Forest

+0

@Furze申し訳ありませんが、私の間違いです。私は間違った行を印刷した...私はそれを変更しました。 –

+0

'document.getElementById(aId).click();'を '$("# "+ aId).trigger(" click ");'に変更してみてください。 – Forest

答えて

12

Microsoft IEでBLOBを直接開くことはできません。 window.navigator.msSaveOrOpenBlobを使用する必要があります。それが必要な場合はmsSaveBlobもあります。

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

最後の一つです:Firefoxはclick()をサポートしていないため、以前のコードは、Firefoxで動作しません。あなたはこのスニペットを使用して、その動作をprototypeことができます。

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

おかげで束。それはそうです! –

+0

ありがとうございました!私は何時間も同様のことを解決しようとしてきました。 Firefox 5は、バージョン5以降、HTMLElementで.clickメソッドをサポートしています。 –

関連する問題