2016-05-12 33 views
1

d3.jsスクリプトで、レイアウトの1つに関するいくつかの関数を書き直したい。これらの関数を別々のファイルにカットアンドペーストしてd3.jsの後に読み込むと、内部関数がd3.jsの内部関数を呼び出すため、視覚化は機能しなくなりました。Javascript:別のファイルからD3内の関数を呼び出す

d3.js:

!function() { 
    var d3 = { version: "3.5.17" }; 
    function d3_funct() { return d3; } // this function is called in the other file 
}(); 

chord.js:

d3.svg.chord() = function() { 
    var funct = d3_funct; // doesn't work 
}; 

質問:私は私のスクリプト内で、上記の関数、d3_functを使用する方法

chord.js 、d3_functが直ちに実行される関数式の中で別のファイルに定義されている場合

オプション:

  1. 編集d3.jsは
  2. は、囲むD3機能の名前を変更:(書き換えるとchord.jsにそれをロードするためにjQueryを使用するための機能を引き出すのではなく、直接ファイル
。 ?

は、私が何かをしないのです

答えて

1

ので、実行のご注文は、次のようになります。

上記

function myBetterD3Funct() { ... } 
d3.d3_funct = myBetterD3Funct; 

によって次のようになります。10

  1. ロードは、あなたのコードの残りの部分

あなたの修正ファイルには、のようになるはずですが

  • カスタム変更をロードロードd3.jsはるかに良い選択肢。最新のバージョンをダウンロードするたびにd3.jsファイルを変更する必要はありません(したがって、d3.jsを使用してd3.jsをユーザに提供できるようになります)。

    d3グローバル関数自体をオーバーライドしたくない場合は、別のオプションがあります。 myBetterD3Functの複雑さと、それにアクセスする必要があるものは、d3の範囲内で、以下のすべてのケースで機能しないことがあります。

    function myBetterD3Funct() { ... } 
    myBetterD3Funct.apply(d3); 
    

    これは、(実行時の)関数のスコープをグローバルd3オブジェクトに設定することです。これにより、グローバルd3オブジェクト内のトップレベルプロパティを参照することが可能になります(this)。以下のコメントに記載されているように、コード内の多くの関数と変数はwritten to be privateです。したがって、ソースコードを変更するために保存することはできません。

  • +1

    "これは、' this'を使ってグローバル 'd3'オブジェクト内のものを参照することを許可します。" - すべてではない:実際には、ローカル変数(OPがアクセスしようとしているもの)にアクセスすることはできません。 OPの場合、d3コードは意図的にこの方法で記述されているため、アクセスできません。これはJavaScriptのプライベート値パターンです。 – Amadan

    +1

    D3 v4.0が「モジュール」に分割されました。これがOPに適していると思いますか? –

    +0

    @Amadan彼は最上位レベルのローカル変数( 'd3'オブジェクトの直接のもの)にアクセスできるはずです。しかし、ええ、閉鎖された関数の中に入る方法はありません - 私は更新でそれを明らかにするでしょう。 –

    関連する問題