2

I have on my site legacy JavaScript that uses Sizzle as selector engine.

I recently added the dojo library (v 1.8) for visualization purposes (charts, etc.). Because dojo includes selectors (dojo/select), I am thinking that Sizzle is now redundant and that I could replace it with dojo/select. Is there a way to make dojo/select work with non-AMD code?

4

3 に答える 3

1

ドキュメントによると、DOJO セレクター エンジンを AMD/Dojo 互換バージョンのsizzleまたはslickに交換できます。もし私があなただったら、Sizzle を残しておき、Dojo の基礎となるセレクターを Sizzle に変更して、レガシー コードに触れることなく冗長性を取り除きます。

他のセレクタ エンジン レベルを使用することもできます。Sizzle と Slick はどちらも、dojo/query で動作する優れたセレクター エンジンです。AMD/Dojo 互換バージョン (AMD でラップされたもの) は、次の場所から入手できます。

インストールが完了すると、セレクタ エンジン モジュール ID を指定されたセレクタ エンジン レベルとして使用できます。ページのクエリ エンジンとして Sizzle を設定できます。

<script data-dojo-config="selectorEngine: 'sizzle/sizzle'" src="dojo/dojo.js">
</script>

または、特定のモジュールのエンジンとして Slick を設定します。

define(["dojo/query!slick/Source/slick"], function(query){
  query(".someClass:custom-pseudo").style("color", "red");
});
于 2012-09-18T23:20:59.543 に答える
1

Brandon Booneの答えは非常に便利なので、セレクター文字列を書き直す必要はありません。あなたが求めているのはdojo/query、グローバル名前空間にエクスポートする方法、つまりwindowAMDの非同期性を介してオブジェクトにエクスポートする方法だと思います。次の 2 つのオプションがあります。

  1. リリース バージョンを使用する場合は、dojo/query既にパックされdojo.jsているため、モジュール ファクトリ関数の非同期実行に注意する必要はなく、変数をエクスポートするだけです。

    <script 
        src="http://ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.js"
        data-dojo-config="async:true"
    ></script>
    
    <script>
        // export query module to global namespace (window object)
        require(["dojo/query"], function(query) {
            window.query = query;        
        });
    </script>
    
    <script>
        // query function is now available globally
        console.log(query("li"));
    </script>
    

    jsFiddle でこの例を参照してください: http://jsfiddle.net/phusick/gvnGu/

  2. dojo/queryベースレス dojo を使用する場合は、実際にロードするのを待たなければならないため、よりトリッキーになります。

    <script src="dtk-sdk/dojo/dojo.js" data-dojo-config="async:true"></script>
    
    <script>
        // wrap your lecacy code into a function so it's not executed immediately
        var executeNonAmdCode = function() {
            console.log(query("li"));
        }
    </script>
    
    <script>
        require(["dojo/query"], function(query) {
            // export query module to global namespace (window object)
            window.query = query;
            // execute the legacy code
            executeNonAmdCode();
        });
    </script>
    
于 2012-09-19T07:03:15.410 に答える
0

@phusickの答えに追加するために、v1.8 dojoから始めるとこれがサポートされることを知りました:

<script type="dojo/require">
    "myApp.query": "dojo/query"
</script>

上記のコードは、クエリ メソッドをグローバル myApp オブジェクトに追加します (必要に応じて myApp を作成します)。

ソース:

http://dojotoolkit.org/reference-guide/1.8/dojo/parser.html#dojo-parser

于 2012-10-11T04:33:23.640 に答える