6

Chrome拡張機能で複数のファイルをダウンロードしようとしています。次のコードは、ファイルへのダミーリンクを作成し、ファイルをダウンロードする.click()イベントをトリガーします。 問題は、最初の.click()イベントだけがダウンロードを開始することです。後続の.click()イベントは無視されます。ここでJavaScriptのclick()メソッドはChrome拡張機能で1回のみ動作します

manifest.jsonを:私が試した

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

  • 異なるアプローチをダウンロードするためにここでsample.js

    { 
        "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 
    } 
    

    記述されたファイルFileSaver.jsを用いChrome Extension write to file system中のD、全く同じ結果で、最初のファイルがダウンロードされ、二番目は私が回避しようとしたコンテンツセキュリティポリシー違反、その結果、Is it possible to make two .click method calls in javascriptに記載されているようにタイムアウトを追加

  • ありませんContent-Security-Policy error in google chrome extension makingで説明したアプローチを使用しますが、成功も成功せず、JQuery click event works only onceで説明したが、私は私が正しく、このいずれかを実施し、100%はわからないようにjQuery .live方法を使用して

  • なし(後でコードを投稿することができ、人々の場合このアプローチで解決しなければならないと思います)

なぜ複数のファイルを簡単に保存するのが難しいのか驚いた。助けをお待ちしています。

+1

[chrome.downloads'](https://developer.chrome.com/dev/extensions/downloads)を数ヶ月待ちます。html)APIが広く入手可能です。 CSPエラーについて: 'a'はリンクです。その' toString'プロパティはリンクのターゲットを返します。したがって、 'setTimeout(a、300);'を使うと、リンクのターゲットを評価しようとします。 String-as-codeの評価はデフォルトでは禁止されているため、エラーが発生します。 'setTimeout(function(){a.click();}、300);'を使うと、ファイルはまだダウンロードされません。 –

+0

この問題の一時的な解決方法をお探しですか? – coneybeare

+0

私はそれがセキュリティ問題のために不可能だと思います。可能であれば、事実上、1回のクリックで無限のポップアップ/ダウンロードを開くことができます。 –

答えて

0

の代わりに、もはや推奨され.live() Methodeのを使用して、ここで.on()

$(document).on("click", "a", function(event){ 
    // do whatever 
}); 

を試しトリックはelement.clickメソッドを使用するのではなく、複数のMouseEventを作成することではありませんdocumentation

+0

チップをありがとうが、残念ながらそれは役に立たなかった。 – toby88

4

です。これが機能するには、クリックするたびにMouseEventを作成する必要があります。

しかしChromeでこの方法を使用する場合は、あなたが を尋ねるブラウザから警告を受ける
function clicker(el, clickCount) { 
    var mousedownEvent; 
    while(clickCount--) { 
    mousedownEvent = document.createEvent("MouseEvent"); 
    mousedownEvent.initMouseEvent("click", true, true, window, 0, null, null, null, null, false , false, false, false, 0, null); 
    el.dispatchEvent(mousedownEvent); 
    } 
} 

clicker(a, 3); 
// your anchor 'a' gets clicked on 3 times. 

「このサイトは、複数のファイルをダウンロードしようとしている。あなたがこれを許可しますか?[拒否]、[許可]を」。したがって、拡張機能の背景ページ内でこれを行うと、背景ページに警告が表示され、ユーザーはそれを見ることができないので、「許可」をクリックする方法はありません。

アンカーを「クリック」するタブを作成することができます。このような何か:これが機能する

function _anchorDownloader(url, filename) { 
    var timeout = 500; 
    return 'javascript:\'<!doctype html><html>'+ 
    '<head></head>' + 
    '<script>' + 
     'function initDownload() {'+ 
     'var el = document.getElementById("anchor");'+ 
     'el.click();' + 
     'setTimeout(function() { window.close(); }, ' + timeout + ');' + 
     '}'+ 
    '</script>' + 
    '<body onload="initDownload()">' + 
     '<a id="anchor" href="' + url + '" download="'+ filename + '"></a>'+ 
    '</body>' + 
    '</html>\''; 
}; 

function downloadResource(info, tab) { 
    // ... 
    chrome.tabs.create({ 'url' : _anchorDownloader(url, filename), 'active' : false }); 
    // ... 
} 

chrome.contextMenus.create({"title": "Save Image…", "contexts":["image"], "onclick": downloadResource }); 

は、拡張子がmanifest.jsonをpermissionとして"tabs"を持っている必要があります。タイムアウトを調整してタブを閉じることができますが、それをあまりにも速く閉じると、ダウンロードは行われません。

+0

私はこれに大きな期待を持っていましたが、Chromeは依然として複数のディスパッチイベントをブロックしているようです。私は3回同じリンクをクリックしようとしているのではなく、むしろ3つの異なるリンクを必ず同じページに置いています。最初の人だけがここで「クリック」されます – coneybeare

+0

私はあなたが何を意味するのか理解していると思います。エレメントにMouseEvent/dispatchEventを追加/削除することなく試してみてください。だから、それを作成し、プロパティを割り当てて、イベントを追加したり削除したりせずにディスパッチしてください。私はChrome 25.0.1364.172でこれを試したところ、私のために働いていました。 – zertosh

+0

要素を作成して追加しない方法はありますか? createElement()は両方を行うようです。 – coneybeare

関連する問題