[解決済み] 文字列からWeb Workerを作成する方法
質問
文字列(POST リクエストで提供される)から Web ワーカーを作成するにはどうすればよいですか?
私が思いつく方法の1つは、サーバーの応答から data-URI を作成し、それを Worker コンストラクタに渡すことですが、一部のブラウザは同じ起源ポリシーのため、これを許可しないと聞いたことがあります。
MDN では、データ URI のオリジン ポリシーに関する不明確な点として :
注意: Worker コンストラクタのパラメータとして渡される URI は、same-origin ポリシーに従わなければなりません。Gecko 10.0 (Firefox 10.0 / Thunderbird 10.0) 以降では、データ URI を Worker の有効なスクリプトとして許可しています。他のブラウザは同意しないかもしれません。
また、次のような投稿もあります。 で議論しています。 .
どのように解決するのですか?
<ブロッククオート概要
-
blob:
Chrome 8+、Firefox 6+、Safari 6.0+、Opera 15+ の場合。 -
data:application/javascript
Opera 10.60 - 12 用 -
eval
それ以外 (IE 10 以上)
URL.createObjectURL(<Blob blob>)
は、文字列から Web Worker を作成するために使用できます。blob の作成には
BlobBuilder
API
非推奨
または
Blob
コンストラクタ
.
デモです。 http://jsfiddle.net/uqcFM/49/
// URL.createObjectURL
window.URL = window.URL || window.webkitURL;
// "Server response", used in all examples
var response = "self.onmessage=function(e){postMessage('Worker: '+e.data);}";
var blob;
try {
blob = new Blob([response], {type: 'application/javascript'});
} catch (e) { // Backwards-compatibility
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
blob = new BlobBuilder();
blob.append(response);
blob = blob.getBlob();
}
var worker = new Worker(URL.createObjectURL(blob));
// Test, used in all examples:
worker.onmessage = function(e) {
alert('Response: ' + e.data);
};
worker.postMessage('Test');
互換性
ウェブ ワーカーは以下のブラウザでサポートされています。 ソース :
- クローム 3
- Firefox 3.5
- IE 10
- オペラ 10.60
- サファリ 4
このメソッドのサポートは
Blob
API と
URL.createObjectUrl
メソッドを使用します。
Blob
互換性
:
-
Chrome 8+ (
WebKitBlobBuilder
), 20+ (Blob
コンストラクタ) -
Firefox 6+ (
MozBlobBuilder
), 13+ (Blob
コンストラクタ) -
Safari 6+ (
Blob
コンストラクタ)
IE10では
MSBlobBuilder
と
URL.createObjectURL
. しかし、Web Worker の作成は
blob:
-URL から Web Worker を作成しようとすると、SecurityError がスローされます。
Opera 12 は
URL
APIを使用しています。一部のユーザーは、偽バージョンの
URL
オブジェクトの偽バージョンを持っている場合があります。
のこのハックは
browser.js
.
フォールバック 1: data-URI
Opera では、data-URI を
Worker
コンストラクタの引数としてサポートしています。注意: 忘れてはならないのは
特殊文字をエスケープする
(例えば
#
と
%
).
// response as defined in the first example
var worker = new Worker('data:application/javascript,' +
encodeURIComponent(response) );
// ... Test as defined in the first example
デモ http://jsfiddle.net/uqcFM/37/
フォールバック 2: 評価
eval
は、Safari (<6) および IE 10 のフォールバックとして使用することができます。
// Worker-helper.js
self.onmessage = function(e) {
self.onmessage = null; // Clean-up
eval(e.data);
};
// Usage:
var worker = new Worker('Worker-helper.js');
// `response` as defined in the first example
worker.postMessage(response);
// .. Test as defined in the first example
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 独立したJavascriptファイルを持たないWebワーカー?
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] JavaScriptで長い配列を小さい配列に分割する方法
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?