Javascript でブロッキングを行うべきではないことはわかっていますし、そうしなければならないことからリファクタリングできなくなったことは一度もありません。しかし、コールバックで処理する方法がわからないことに遭遇しました。html2canvas で Downloadify を使用しようとしています (これは IE 専用です。データ URI のダウンロードは IE では機能しません)。Flash オブジェクトが何をダウンロードするかを認識できるように、データ関数を指定する必要があります。残念ながら、html2canvas は非同期です。データ URI を取得する前に、onrendered イベントが入力されるまで待機できる必要があります。
$('#snapshot').downloadify({
filename: function(){
return 'timeline.png';
},
data: function(){
var d = null;
html2canvas($('#timeline'),{
onrendered:function(canvas){
d = canvas.toDataURL();
}
});
//need to be able to block until d isn't null
return d;
},
swf: '../static/bin/downloadify.swf',
downloadImage: '../static/img/camera_icon_32.png?rev=1',
width: 32,
height: 32,
transparent: true,
append: false
});
これを行う他の方法についての提案は受け付けていますが、行き詰まっています。
編集- いくつかのコメントにより、Downloadify に関する詳細情報が必要であるように思われました ( https://github.com/dcneiner/Downloadify )。Downloadify は、ブラウザーの [名前を付けて保存] ウィンドウをトリガーするために使用できる Flash オブジェクトです。downloadify() 関数は、Flash オブジェクトを初期化<object/>
し、要素にタグを付けるだけです。これは Flash オブジェクトであるため、セキュリティ違反を引き起こさずに Javascript からイベントをトリガーすることはできません。
Canvas要素の画像をダウンロードするためだけにIEに使用しています。他のすべてのブラウザーでは、データ URI を使用できますが、IE は特別な花です。