2012-08-23 15 views
5

2つのスクリプト間でデータを正しく通信するにはどうすればいいですか?スクリプト間の通信| 3つの方法

この特定のケースでは、1つのスクリプトに要素がありますが、別のスクリプトに要素を追加したいと思います。

私がこれを行うことができる最も簡単な方法は、グローバルウィンドウオブジェクトを中断して使用することです。

しかし、グローバルはベストプラクティスではありません。

この要素を別のスクリプトに渡す正しい方法は何ですか?

両方のスクリプトは、モジュールパターンでカプセル化されています。

スクリプト0作成エレメントポイント

var element = document.createElement("div"); 
element.innerHTML = response_text; 

スクリプト1追加要素ポイント

Vi.sta = { 

    // implemented in the boot loader - shared global space - appended child already - you don't have to append until now. 
    // Static data has already been composed. 
    // Pull off window and append or best practice 

}; 

両方がモジュールパターン

(function(){ 
    // the code here 
})() 

答えて

4

すべてのJSスクリプトはグローバルスコープで実行されます。ファイルがクライアントにダウンロードされると、ファイルはグローバルスコープで解析されます。

あなたは

// File_1.js 
var myObj = { colour : "blue" }; 

を持っているのであればこれを行うことからあなたを停止する何もありません:

// File_2.js 
var otherObj = { colour : myObj.colour }; 

は、限り、あなたならばFile_1.jsがFile_2.js

前にロードされるとすなわち、MYNAMESPACE = {};であり、各ファイルは(直ちに起動する関数からのインタフェースを返すことを意味する「モジュールパターン」ではなく)モジュールを通してあなたの名前空間を拡張します。モジュールの存在を確認してください。

名前空間のアプリケーション用のモジュールを作成していて、1つのモジュールから別のモジュールに変数にアクセスする必要がある場合は、interfaceを提供する必要があります。あなたはSANDBOXINGのモジュールがある場合は

は、その後、あなたがそれらを提供するために必要なすべてのmediator-patternに基づいてservice-locatorまたは"registry"、または開発messaging-systemに似proxy

+0

私は両方のスクリプトがモジュールパターンにカプセル化されていると述べましたが... –

+0

@HiroProtagonist ***どの***モジュールパターンについて言及しませんでした。あなたは 'revealing-module'について話していますか、' namespacing'について話しているのですか、 'sandboxing'について話していますか? 3つには非常に異なるレベルの回避策があるためです。それがどれであるかを知る方法が全くないので、どの回避策が正しいかわからない。 – Norguard

+1

私にはGoogleにとって良いキーワードがたくさんあります。 –

5
window.sharedSpace = {}; 
sharedSpace.sharedValue = 'foo bar'; 
にカプセル化され

このように、複数のグローバルオブジェクトを1つだけ持つことができます。

+0

私は同じことを書いていました。私の唯一の勧告は、それがすでに存在している可能性を除いて、宣言する前に 'window.sharedSpace'の存在をチェックすることです。 – jackwanders

+0

1つのスクリプトから戻って他のスクリプトにインポートすると、グローバルを避ける方法として、これがより良いかもしれませんか? –

+0

あなたが話している「戻る」部分には、グローバルな 'function'が必要です。どちらが後ろに行くだろう。 –

1

要素をモジュール内の関数に渡すのはなぜですか?

var module1 = (function() { 
    return { 
     func1: function() { 
      // get your element 
      var someElement = ...; 

      // pass it to the other module 
      module2.func2(someElement); 
     } 
    }; 
})(); 

var module2 = (function() { 
    return { 
     func2: function (someElement) { 
      // do whatever you want with someElement 
     } 
    }; 
})(); 
+0

さらに簡単に、なぜ要素またはオブジェクトをエクスポートし、それを使用してインポートしてくださいモジュールパターンのグローバルなインポート機能...両方の方法がうまくいくと思います。 –

+0

@HiroProtagonist私は "global imports"に慣れていません – jbabey

+0

IIFEでは、最後の '()'は、グローバルインポートと呼ばれるパラメータを入れた場合、グローバルスコープとしてインポートされ、スコープルックアップチェーンが縮小されました。 –