2011-12-15 3 views
3

ブラウザで直接実行するか、ブラウザで利用可能なときにWebワーカーとして実行できるスクリプトがあります。私はこのスクリプトの一部を、ワーカーとして実行する場合にのみ実行したいと思います。だから私の質問は、スクリプトがこのように実行されていると自分自身を識別することができますか?JSスクリプトがワーカーとして実行されているときの特定

私は、これが起こることを可能にする仕様で何も見ることができません。明白な何かが欠けている?

+1

特定のプロパティの存在を確認できます。私は例えば信じる。 'window'はワーカースクリプトで定義されていません(つまり、' typeof window === "undefined"?worker:normal')。私は完全に確信していません。 – pimvdb

+0

私はこのようなことを避けることを望んでいました。ウィンドウは他の環境では利用できないためですが、おそらくそうする必要があります。 – Graham

+0

良い点。おそらく 'postMessage'はの存在を確認するものです。 – pimvdb

答えて

1

<html> 
<head> 
<title>Worker</title> 
</head> 
<body> 
</body> 
<script > 
    var w = new Worker ('worker.js'); 
    w.onmessage = function (e) { 
    document.body.innerHTML += '<br>' + 'WORKER : ' + e.data; 
    }; 
</script> 
<script src='worker.js'></script> 
</html> 

worker.jsスクリプトとして及び労働者としての両方に呼び出されます。

worker.jsは含まれています。労働者の環境では

var msg = 'postMessage is ' + postMessage.toString() + 
      ', self.constructor is ' + self.constructor; 
    try { 
    postMessage (msg); 
    } catch (e) { 
    document.body.innerHTML += '<br>SCRIPT : ' + msg; 
    } 

、のpostMessageは、成功したのいずれか、それはブラウザで、未定義であるかので、それが失敗したスクリプト環境では、それが二番目の引数が必要です。

出力は次のとおりです。

クローム:

SCRIPT : postMessage is function() { [native code] }, self.constructor is function DOMWindow() { [native code] } 
WORKER : postMessage is function postMessage() { [native code] }, self.constructor is function DedicatedWorkerContext() { [native code] } 

のfirefox:

SCRIPT : postMessage is function postMessage() { [native code] }, self.constructor is [object Window] 
WORKER : postMessage is function postMessage() { [native code] }, self.constructor is function DedicatedWorkerGlobalScope() { [native code] } 

オペラ:すべてのUbuntuの下

WORKER : postMessage is function postMessage() { [native code] }, self.constructor is function Object() { [native code] } 
SCRIPT : postMessage is function postMessage() { [native code] }, self.constructor is function Object() { [native code] } 

+0

必要な第2引数に関する良い点。そうするだろう! – Graham

0

私はModernizr(これはオープンソースのJavaScriptライブラリであり、何度も何度も何度も何度も何度も何度も再学習しなくてもいいです)を使用します。以下で

if (Modernizr.webworkers) { 
    // window.Worker is available! 
} 
else { 
    // no native support for web workers 
} 
関連する問題