3

Selectorルックアップの数を最小限に抑える方法を見つけようとしています。私の問題は、ベース$(document).ready()で定義された変数があり、$(document).ready()内にネストされた関数内で更新する必要があることです。

この例を考えてみましょう(編集:わかりやすくするために更新しました)

<script>

//var $current_page = $home_page;  **<--I DONT want to do this, going global
                                        and of course it doesn't work since
                                        $home_page isn't defined yet.**

$(document).ready(function() {
  var $home_page = $("#home-page");
  var $portfolio_page = $("#portfolio-page");
  var $about_page = $("#about-page");
  var $current_page = $home_page;  // **<--This variable, in this scope level,
                                   //      is what I want updated**

  $("#home-btn").click(function () {
   $current_page.stop()
   $current_page.show()
   $current_page.animate({
    duration: 360, 
    easing: 'easeInCirc',
    complete: function() {
        $(this).css({ top: -700 });
    }

   ); 

   $current_page = $home_page;
  });

   $("#portfolio-btn").click(function () {
       $current_page.stop()
       $current_page.show()
       $current_page.animate({
         duration: 360, 
         easing: 'easeInCirc',
         complete: function() {
             $(this).css({ top: -700 });
         }

   ); 

   $current_page = $portfolio_page; //<--This needs to somehow update the
                                    //   variable in the $(document).ready
                                    //   scope, but not global**
  });
 });
 <script>

変数$current_pageをグローバル変数にせずに更新するにはどうすればよいですか?

編集:これは、メニュー項目をクリックしたときに現在のページdivをアニメーション化するために行われます。はい、それは欠けているものです、はい、それは意味をなさないかもしれません。これは単なる例であり、実際のアプリケーションではありません。

私は、この例がパフォーマンスにとってまだ些細なことであることを理解しています。その事実を無視してください。これを実現する方法を知りたいだけで、それがベストプラクティスなのかパフォーマンスなのかについてのレッスンではありません。みんなありがとう。

4

2 に答える 2

1

内部関数はクロージャを作成し、それが定義されているスコープ内の変数をキャプチャします。したがって、あなたはすでにあなたが求めているものを持っています...

...それが良い考えかどうかは別の問題です。

手始めに、リストしたコードの値を実際に変更$current_pageしているのではなく、すでに初期化されているのと同じ値を割り当てています。

しかし、別の値を選択するために通常使用するコードを省略したと仮定すると$current_page、自分自身に問いかける必要があります。これは本当に必要なのですか?要素IDに基づいてルックアップを実行し、その要素への参照を変数にキャッシュしますが、実際にそれが再び必要になるかどうか、いつ必要になるかはわかりません。せいぜい、これは潜在的に不必要なルックアップをもたらします。最悪の場合、メモリリークが発生する可能性があります。ID自体を追跡し、実際に必要なときに必要な場所で要素を検索してみませんか?実際にパフォーマンスの問題が発生するまで、パフォーマンスについて心配する必要はありません...または、時期尚早の最適化によって、解決するよりも多くの問題が発生する場合があります。

同じことが当てはまります。また、必要に応じてそれらの要素を検索できる場合は、後でこれらの要素への参照が必要になる可能性があるため$home_page、ページの読み込みが(わずかに)遅く$portfolio_pageなり$about_pageます。

于 2010-07-01T16:13:40.083 に答える
0
  • 「変数$current_pageをグローバル変数にせずに更新するにはどうすればよいですか?」

    今すぐ更新できます。内部のクリックハンドラ関数は$current_pageを変更できます。

  • 「セレクタールックアップの数を最小限に抑える方法を見つけようとしています。」

    しかし、別のセレクターで$ current_pageを変更している場合は、実際にはもっと多くのことを作成しようとしているようです。

しかし、あなたが本当に何をしようとしているのかははっきりしていません。

于 2010-07-01T16:11:16.407 に答える