Ich versuche, mehrere Dateien in einer Chrome-Erweiterung herunterzuladen. Der folgende Code erstellt eine Dummy-Verknüpfung zu einer Datei und löst dann das Ereignis .click() aus, das die Datei herunterlädt. Das Problem ist, dass nur das erste .click() Ereignis einen Download auslöst. Nachfolgende .click() - Ereignisse werden ignoriert.JavaScript click() -Methode funktioniert nur einmal in der Chrome-Erweiterung
Hier die manifest.json:
{
"name": "Simple File Downloader",
"version": "0.1",
"permissions": ["contextMenus", "http://*/"],
"background": {
"persistent": false,
"scripts": ["sample.js"]
},
"content_security_policy": "script-src 'self'; object-src 'self'",
"manifest_version": 2
}
Hier die Sample.js:
function onClickHandler(info, tab) {
var a = document.createElement('a');
a.href = 'http://or.cdn.sstatic.net/chat/so.mp3';
a.download = 'so.mp3';
document.body.appendChild(a);
a.click(); // this click triggers the download
// this timeout violates content security policy
// setTimeout(a, 300);
a.click(); // this click doesn't do anything
document.body.removeChild(a);
a = document.createElement('a');
a.href = 'http://or.cdn.sstatic.net/chat/so.mp3';
a.download = 'so.mp3';
document.body.appendChild(a);
a.click(); // this click doesn't do anything either
document.body.removeChild(a);
};
chrome.contextMenus.onClicked.addListener(onClickHandler);
chrome.runtime.onInstalled.addListener(function() {
chrome.contextMenus.create({"title": "Download File", "id":"download_file"});
});
Ich habe versucht:
verschiedene Ansätze zum Download Dateien wie beschrieben d in Chrome Extension write to file system mit FileSaver.js, mit dem exakt gleichen Ergebnis wird die erste Datei heruntergeladen, zweite nicht
ist das Hinzufügen Timeouts wie in Is it possible to make two .click method calls in javascript beschrieben, was zu einer inhaltssicherheitspolitischen Verletzung, die ich versuchte, um zu arbeiten mit dem Ansatz in Content-Security-Policy error in google chrome extension making beschrieben, aber ohne Erfolg
die jQuery .live Verfahren wie in JQuery click event works only once, auch ohne Erfolg beschrieben, aber ich bin nicht 100% sicher, dass ich diese korrekt umgesetzt (kann Code schreiben später, wenn die Menschen denke, dieser Ansatz sollte es lösen)
Überrascht, warum es so schwer ist, einfach mehrere Dateien zu speichern. Schätze jede Hilfe.
Warten Sie ein paar Monate und die ['chrome.downloads'] (https://developer.chrome.com/dev/extensions/downloads.html) API ist weit verbreitet. Über den CSP-Fehler: 'a' ist eine Verknüpfung, deren' toString' -Eigenschaft das Ziel der Verknüpfung zurückgibt. Wenn Sie also 'setTimeout (a, 300);' verwenden, versucht es, das Ziel der Verbindung zu bewerten. String-as-code-Auswertung ist standardmäßig nicht zulässig, daher erhalten Sie den Fehler. Wenn Sie 'setTimeout (function() {a.click();}, 300);' verwenden, wird die Datei immer noch nicht heruntergeladen. –
Haben Sie eine temporäre Lösung für dieses Problem gefunden? – coneybeare
Ich denke, es ist kein Sicherheitsproblem möglich. Wenn es möglich wäre, dann könnte ich praktisch unendlich Popup/Download mit einem einzigen Klick öffnen. –