2012-01-20 20 views
0

短い話ですが、jQueryを使用する長いコードがあります。たくさんのファイルや関数などjQueryには2倍の厄介なものが含まれているため、インストールされたアドオン、ツールバーなどがJavaScriptコードを壊しているため、理想的ではないユーザーのコードに問題があります。 グローバルスコープの関数内で定義された関数へのアクセス?

:私はjQueryの

  • 使用$ .noConflict
  • をちょうど

    1. 含めることができると思った

      はその後のようなものの間に私のコードの全体の残りの部分が含まれます。

      (function($) { 
          // All of my code goes here. 
      })(jQuery); 
      

      これらのユーザーに問題が解決したかどうかは確認されていませんが、問題はありません。問題は、サイトのある部分(画像のアップロード)に、私たちが大量のコードで定義されている関数のいくつかを呼び出すiframeを持っていることです。私はこの名前のない関数呼び出しからそれらの関数を入れようとしましたが、それ自身に存在しなければならない他の関数を使用しています。

      上記の関数内で定義されている関数(これを上に示したもの)に、それ以外のコードからアクセスするにはどうすればよいでしょうか?

      ありがとうございます!

  • +0

    PS - あなたは匿名の機能で余分なクラフトを持っています。あなただけが必要です: '(function($){var mycode ="ここに行く ";})(jQuery);'。 – cheeken

    +0

    ありがとう、編集中。 – manuelflara

    答えて

    1

    あなたは「外から関数コンテキストにアクセスすることはできません世界"。さて、あなたは.__parent__属性にアクセスすることを許していたいくつかの古いjsエンジンでそれを行うことができましたが、これは古いものであり、もう利用できなくなっています。

    しかし、クロージャ内でいくつかの関数を公開するか、すべてのロジックを書き込む名前空間オブジェクトを作成する必要があります(親コンテキストでも使用できる必要があります)。

    私は多分良く

    (function($) { 
        function myFunc() { 
         // do stuff 
        } 
    
        function anotherFunc() { 
        } 
    
        window.myFunc = myFunc; // expose myFunc globally 
    }(jQuery)); 
    

    のようなものをお勧めしたいので:

    var myNameSpace = { }; 
    (function($) { 
        myNameSpace.myFunc = function() { 
         // do stuff 
        }; 
    }(jQuery)); 
    
    // somewhere else 
    myNameSpace.myFunc(); 
    
    1

    なぜあなたは自己実行匿名関数に渡すjQuery関数オブジェクトの呼び出しでコードをラップしていますか?すべてのコードからjQueryオブジェクトを作成することを意味していますか?

    コードを外部に公開するには、コードの範囲外のオブジェクト(ウィンドウオブジェクトなど)に関数とオブジェクトを割り当てる必要があります。あなたが公開したかったさまざまなメソッドとプロパティを含むオブジェクトを作成した場合

    たとえば、あなたがこれを行うことができます:

    //Your self-executing anonymous function 
    (function($) 
    { 
    //Object which contains various useful methods and properties 
    var useful = {...}; 
    
    //Expose it to the outside world 
    window.Useful = useful; 
    })(jQuery); 
    

    EDITを:他の人が指摘しているとして、それはのように理想的なソリューションではありませんあなたが慎重でない場合は、実際に名前の衝突に遭遇します。また、匿名関数の外部にあるオブジェクトを名前空間オブジェクトとして使用することは、私の推奨する方法です。

    1

    これは理想的な方法ではありませんが、グローバルスコープで宣言できます。

    (function($) { 
        globalFunct = function (arg1, arg2) { // Don't use var keyword 
         ... 
        }; 
    })(jQuery); 
    

    あなたはずっとあなたがjQueryを使って観察しているように、衝突を命名に実行することができますので、それは理想的ではありません。すべてのグローバルにアクセス可能なメソッドを「パッケージ」に入れて、このアプローチを改善してください。それに固有の名前を選択します。これにより、衝突を防ぎます。

    // Somewhere outside of your anonymous function, in the global scope 
    var myPackage = {}; 
    
    (function($) { 
        myPackage.globalFunct = function (arg1, arg2) { 
         ... 
        }; 
    })(jQuery); 
    

    myPackage.globalFunct()を呼び出してこのメ​​ソッドを呼び出します。

    0

    はい、あなたはクロージャ内から「エクスポート」機能をすることができます: はい、あなたはクロージャ内から「エクスポート」機能を行うことができます

    (function() { 
        function a() { 
         console.log("a"); 
        } 
    
        function b() { 
         a(); 
         console.log("b"); 
        } 
    
        // make b globally available 
        window.b = b; 
    })(); 
    
    b(); 
    
    0
    window.PARTY_CATS_jQuery = jQuery.noConflict(true); 
    
    (function($) { 
        $(function() { 
        // All of my code goes here. 
        }); 
    })(COMPANY_NAME_jQuery); 
    

    を次にあなたがPARTY_CATS_を感じた場合は、ちょうどあなたのグローバル関数

    PARTY_CATS_jQueryを使用することはできません一意の十分な名前は、より安全な何かを選択するBABY_KILLER_jQuery

    関連する問題