Próbuję pobrać wiele plików w rozszerzeniu Chrome. Poniższy kod tworzy fikcyjne łącze do pliku, a następnie wyzwala zdarzenie .click(), które pobiera plik. Problem polega na tym, że tylko pierwsze zdarzenie .click() wyzwala pobieranie. Kolejne zdarzenia .click() są ignorowane.Metoda click() JavaScript działa tylko raz w rozszerzeniu Chrome
Tutaj 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
}
tu 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"});
});
próbowałem:
różne podejścia do pobrania pliki zgodnie z opisem dw Chrome Extension write to file system użyciu FileSaver.js, z dokładnie tego samego wyniku, pierwszy plik zostanie pobrany, drugi nie jest
dodanie limity czasu, jak to opisano w Is it possible to make two .click method calls in javascript, co skutkuje naruszeniem treści polityki bezpieczeństwa, który starałem się obejść stosując metodę opisaną w Content-Security-Policy error in google chrome extension making, ale bez powodzenia
pomocą .live metody jQuery jak opisano w JQuery click event works only once, również bez powodzenia, ale nie jestem w 100% pewien, że ten jeden realizowane poprawnie (można pisać kod później, jeśli ludzi sądzę, że to podejście powinno rozwiązać problem)
Zaskoczony, dlaczego tak trudno jest po prostu zapisać wiele plików. Doceniam każdą pomoc.
Poczekaj kilka miesięcy, a ["chrome.downloads"] (https://developer.chrome.com/dev/extensions/downloads.html) API jest szeroko dostępny. O błędzie CSP: 'a' jest łączem, którego właściwość' toString' zwraca cel łącza. Tak więc, jeśli użyjesz 'setTimeout (a, 300);', spróbuje ocenić cel łącza. Ocena łańcuchów jako kodu jest domyślnie zabroniona, więc pojawia się błąd. Jeśli użyjesz 'setTimeout (function() {a.click();}, 300);', plik nadal nie jest pobierany. –
Czy znalazłeś tymczasowe rozwiązanie tego problemu? – coneybeare
Myślę, że nie jest to możliwe z powodu problemu z bezpieczeństwem. Gdyby było to możliwe, wirtualnie mogłem otworzyć nieskończone wyskakujące okienko/pobieranie jednym kliknięciem. –