JavaScriptを色々あれこれしようとするがひたすら失敗を繰り返している
| Revision | 13 (tree) |
|---|---|
| Time | 2016-11-14 04:42:42 |
| Author | |
ファイル保存の実装
<kbd>tag</kbd>
| @@ -37,3 +37,63 @@ | ||
| 37 | 37 | } |
| 38 | 38 | return (theta * 360 / (2 * Math.PI) - 90); // atan2は X軸基準での角度を出すため、画面表示系の Y軸基準に合わせるため 90を減算する |
| 39 | 39 | }; |
| 40 | + | |
| 41 | + | |
| 42 | +class SaveFile { | |
| 43 | + constructor() { | |
| 44 | + this.filename = null; | |
| 45 | + this.callbackComplete = null; | |
| 46 | + this.callbackError = null; | |
| 47 | + } | |
| 48 | + | |
| 49 | + // ブラウザ上で実行している場合のファイル保存処理 | |
| 50 | + saveFileBrowser(filename, data) { | |
| 51 | + // Blobに変換して download | |
| 52 | + let blob = new Blob([data], { type: "text/plain" }); | |
| 53 | + let a = document.createElement('a'); | |
| 54 | + a.href = URL.createObjectURL(blob); | |
| 55 | + a.target = '_blank'; | |
| 56 | + a.download = filename; // Edgeは無効…… | |
| 57 | + a.click(); | |
| 58 | + | |
| 59 | + // download完了後に memory解放したほうがいい | |
| 60 | + // URL.revokeObjectURL(); | |
| 61 | + }; | |
| 62 | + | |
| 63 | + // アプリケーションとして実行している場合のファイル保存処理 | |
| 64 | + saveFileApp(filename, data, callbackComplete, callbackError) { | |
| 65 | + if (null != callbackComplete) this.callbackComplete = callbackComplete; | |
| 66 | + if (null != callbackError) this.callbackError = callbackError; | |
| 67 | + | |
| 68 | + // Unique filename作成 (ABC.txtが既にある → ABC(1).txt という file nameになる | |
| 69 | + // write, append指定はerrorになる。filepickerかmanifestで権限取得する必要があるかも | |
| 70 | + let fileoption = Windows.Storage.CreationCollisionOption.generateUniqueName; | |
| 71 | + Windows.Storage.DownloadsFolder.createFileAsync(filename, fileoption).done(this.saveFileAppOpenFile.bind(this, data), this.saveFileError.bind(this)); | |
| 72 | + }; | |
| 73 | + | |
| 74 | + // 以下、Private関数 ------------------- | |
| 75 | + | |
| 76 | + saveFileAppOpenFile(savedata, file) { // [!!caution] callback設定時に savedataを無理やりbind済み | |
| 77 | + // 実際に書き込まれた file nameを取得 | |
| 78 | + let name = file.name; | |
| 79 | + // file objectの pathを参照すると保存先 folderが大変なことになっているが | |
| 80 | + // 実際に保存される場所は Downloads/<ApplicationName>/ になる | |
| 81 | + | |
| 82 | + // この時点で fileは既に open済みになっている | |
| 83 | + // fileへデータ書き込み | |
| 84 | + Windows.Storage.FileIO.writeTextAsync(file, savedata); | |
| 85 | + // 書き込み完了チェック | |
| 86 | + Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(this.saveFileComplete.bind(this), this.saveFileError.bind(this)); | |
| 87 | + | |
| 88 | + }; | |
| 89 | + saveFileComplete() { | |
| 90 | + // 保存完了 | |
| 91 | + debuglog('ファイル保存完了'); | |
| 92 | + | |
| 93 | + if (null != this.callbackComplete) this.callbackComplete(); | |
| 94 | + }; | |
| 95 | + saveFileError(err) { | |
| 96 | + console.error('ファイル保存エラー\nerror=' + err.message + 'description=' + err.description); | |
| 97 | + if (null != this.callbackError) this.callbackError(err.message); | |
| 98 | + }; | |
| 99 | +} // class SaveFile |
| @@ -152,25 +152,28 @@ | ||
| 152 | 152 | // DisplayField 領域の innerHTMLを Blobとして保存 |
| 153 | 153 | function onClickSaveLink(evt) { |
| 154 | 154 | debuglog('onClickSaveLink'); |
| 155 | + | |
| 155 | 156 | // 余計な表示情報を消す |
| 156 | 157 | // clear focus |
| 157 | 158 | window.partsFocus.setClingingPartner(null); |
| 158 | - | |
| 159 | 159 | // 表示情報取得 |
| 160 | 160 | let displayInfo = window.displayField.DOMobject.innerHTML; |
| 161 | + // 保存先 file name | |
| 162 | + let filename = 'savefile.txt'; | |
| 163 | + let save = new SaveFile(); | |
| 161 | 164 | |
| 162 | - // Blobに変換して download | |
| 163 | - let blob = new Blob([displayInfo], { type: "text/plain" }); | |
| 164 | - let a = document.createElement('a'); | |
| 165 | - a.href = URL.createObjectURL(blob); | |
| 166 | - a.target = '_blank'; | |
| 167 | - a.download = 'filename.txt'; // Edgeは無効…… | |
| 168 | - a.click(); | |
| 165 | + // save.saveFileBrowser(filename, displayInfo); | |
| 166 | + save.saveFileApp(filename, displayInfo, cmp, err); | |
| 167 | + // Anime GIFなどを指定されていると保存に時間がかかる | |
| 168 | + // 保存中 dialogが必要 | |
| 169 | + }; | |
| 170 | + function cmp() { | |
| 171 | + debuglog('cmp'); | |
| 172 | + }; | |
| 173 | + function err(arg) { | |
| 174 | + console.error('err'); | |
| 175 | + } | |
| 169 | 176 | |
| 170 | - // download完了後に memory解放したほうがいいらしいが…… | |
| 171 | - // URL.revokeObjectURL(); | |
| 172 | - }; | |
| 173 | - | |
| 174 | 177 | function onClickPalButton(evt) { |
| 175 | 178 | debuglog('【onClickPalButton' + evt.target.dataset.palid + '】'); |
| 176 | 179 | switch (parseInt(evt.target.dataset.palid)) { |
| @@ -37,3 +37,63 @@ | ||
| 37 | 37 | } |
| 38 | 38 | return (theta * 360 / (2 * Math.PI) - 90); // atan2は X軸基準での角度を出すため、画面表示系の Y軸基準に合わせるため 90を減算する |
| 39 | 39 | }; |
| 40 | + | |
| 41 | + | |
| 42 | +class SaveFile { | |
| 43 | + constructor() { | |
| 44 | + this.filename = null; | |
| 45 | + this.callbackComplete = null; | |
| 46 | + this.callbackError = null; | |
| 47 | + } | |
| 48 | + | |
| 49 | + // ブラウザ上で実行している場合のファイル保存処理 | |
| 50 | + saveFileBrowser(filename, data) { | |
| 51 | + // Blobに変換して download | |
| 52 | + let blob = new Blob([data], { type: "text/plain" }); | |
| 53 | + let a = document.createElement('a'); | |
| 54 | + a.href = URL.createObjectURL(blob); | |
| 55 | + a.target = '_blank'; | |
| 56 | + a.download = filename; // Edgeは無効…… | |
| 57 | + a.click(); | |
| 58 | + | |
| 59 | + // download完了後に memory解放したほうがいい | |
| 60 | + // URL.revokeObjectURL(); | |
| 61 | + }; | |
| 62 | + | |
| 63 | + // アプリケーションとして実行している場合のファイル保存処理 | |
| 64 | + saveFileApp(filename, data, callbackComplete, callbackError) { | |
| 65 | + if (null != callbackComplete) this.callbackComplete = callbackComplete; | |
| 66 | + if (null != callbackError) this.callbackError = callbackError; | |
| 67 | + | |
| 68 | + // Unique filename作成 (ABC.txtが既にある → ABC(1).txt という file nameになる | |
| 69 | + // write, append指定はerrorになる。filepickerかmanifestで権限取得する必要があるかも | |
| 70 | + let fileoption = Windows.Storage.CreationCollisionOption.generateUniqueName; | |
| 71 | + Windows.Storage.DownloadsFolder.createFileAsync(filename, fileoption).done(this.saveFileAppOpenFile.bind(this, data), this.saveFileError.bind(this)); | |
| 72 | + }; | |
| 73 | + | |
| 74 | + // 以下、Private関数 ------------------- | |
| 75 | + | |
| 76 | + saveFileAppOpenFile(savedata, file) { // [!!caution] callback設定時に savedataを無理やりbind済み | |
| 77 | + // 実際に書き込まれた file nameを取得 | |
| 78 | + let name = file.name; | |
| 79 | + // file objectの pathを参照すると保存先 folderが大変なことになっているが | |
| 80 | + // 実際に保存される場所は Downloads/<ApplicationName>/ になる | |
| 81 | + | |
| 82 | + // この時点で fileは既に open済みになっている | |
| 83 | + // fileへデータ書き込み | |
| 84 | + Windows.Storage.FileIO.writeTextAsync(file, savedata); | |
| 85 | + // 書き込み完了チェック | |
| 86 | + Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(this.saveFileComplete.bind(this), this.saveFileError.bind(this)); | |
| 87 | + | |
| 88 | + }; | |
| 89 | + saveFileComplete() { | |
| 90 | + // 保存完了 | |
| 91 | + debuglog('ファイル保存完了'); | |
| 92 | + | |
| 93 | + if (null != this.callbackComplete) this.callbackComplete(); | |
| 94 | + }; | |
| 95 | + saveFileError(err) { | |
| 96 | + console.error('ファイル保存エラー\nerror=' + err.message + 'description=' + err.description); | |
| 97 | + if (null != this.callbackError) this.callbackError(err.message); | |
| 98 | + }; | |
| 99 | +} // class SaveFile |
| @@ -152,25 +152,28 @@ | ||
| 152 | 152 | // DisplayField 領域の innerHTMLを Blobとして保存 |
| 153 | 153 | function onClickSaveLink(evt) { |
| 154 | 154 | debuglog('onClickSaveLink'); |
| 155 | + | |
| 155 | 156 | // 余計な表示情報を消す |
| 156 | 157 | // clear focus |
| 157 | 158 | window.partsFocus.setClingingPartner(null); |
| 158 | - | |
| 159 | 159 | // 表示情報取得 |
| 160 | 160 | let displayInfo = window.displayField.DOMobject.innerHTML; |
| 161 | + // 保存先 file name | |
| 162 | + let filename = 'savefile.txt'; | |
| 163 | + let save = new SaveFile(); | |
| 161 | 164 | |
| 162 | - // Blobに変換して download | |
| 163 | - let blob = new Blob([displayInfo], { type: "text/plain" }); | |
| 164 | - let a = document.createElement('a'); | |
| 165 | - a.href = URL.createObjectURL(blob); | |
| 166 | - a.target = '_blank'; | |
| 167 | - a.download = 'filename.txt'; // Edgeは無効…… | |
| 168 | - a.click(); | |
| 165 | + // save.saveFileBrowser(filename, displayInfo); | |
| 166 | + save.saveFileApp(filename, displayInfo, cmp, err); | |
| 167 | + // Anime GIFなどを指定されていると保存に時間がかかる | |
| 168 | + // 保存中 dialogが必要 | |
| 169 | + }; | |
| 170 | + function cmp() { | |
| 171 | + debuglog('cmp'); | |
| 172 | + }; | |
| 173 | + function err(arg) { | |
| 174 | + console.error('err'); | |
| 175 | + } | |
| 169 | 176 | |
| 170 | - // download完了後に memory解放したほうがいいらしいが…… | |
| 171 | - // URL.revokeObjectURL(); | |
| 172 | - }; | |
| 173 | - | |
| 174 | 177 | function onClickPalButton(evt) { |
| 175 | 178 | debuglog('【onClickPalButton' + evt.target.dataset.palid + '】'); |
| 176 | 179 | switch (parseInt(evt.target.dataset.palid)) { |