Обновить переменные внутри базовой области jQuery $ (document) .ready ()? - PullRequest
3 голосов
/ 01 июля 2010

Я пытаюсь найти способ минимизировать количество просмотров Селектора.Моя проблема в том, что у меня есть переменная, определенная с помощью base $ (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 без , сделав ее глобальной переменной?

РЕДАКТИРОВАТЬ: Это сделано для анимациитекущий раздел страницы при нажатии на пункт меню.Да, это не хватает вещей, да, это может не иметь смысла.Это всего лишь пример, а не само приложение.

Я понимаю, что этот пример все еще тривиален для производительности, просто проигнорируйте этот факт.Я просто хочу знать, как этого добиться, а не урок, будь то лучшая практика или производительность.Спасибо, ребята.

Ответы [ 2 ]

1 голос
/ 01 июля 2010

Внутренняя функция создает замыкание , фиксируя переменные в области, в которой она определена. Итак, у вас уже есть то, что вы просите ...

... это хорошая идея или нет, это другое дело.

Для начала, вы на самом деле не изменяете значение в коде, который вы перечислили - вы присваиваете $current_page то же значение, с которым оно уже было инициализировано.

Но, предполагая, что вы просто пропустили код, который вы обычно используете для выбора другого значения для $current_page, вам нужно спросить себя: действительно ли это необходимо ? Вы выполняете поиск на основе идентификатора элемента и кэшируете ссылку на этот элемент в переменной, не зная, действительно ли вам это понадобится снова или нет. В лучшем случае это приводит к потенциально ненужному поиску; в худшем случае это может привести к утечке памяти. Почему бы просто не следить за самим идентификатором и искать элемент, когда и где он вам действительно нужен? Не беспокойтесь о производительности, пока не столкнетесь с проблемой производительности ... или вы обнаружите, что преждевременная оптимизация вызвала больше проблем, чем решает.

То же самое относится к $home_page, $portfolio_page и $about_page - вы загружаете свою страницу (немного) медленнее из-за вероятности, что вам понадобится ссылка на эти элементы позже, когда вы может с таким же успехом искать их по мере необходимости.

0 голосов
/ 01 июля 2010
  • "Как я могу обновить переменную $ current_page, не делая ее глобальной переменной?"

    Вы можете обновить ее прямо сейчас.Внутренняя функция обработчика кликов может изменять $ current_page.

  • «Я пытаюсь найти способ минимизировать количество просмотров селектора».

    Но похоже, что на самом деле вы собираетесь зарабатывать больше, если вы меняете $ current_page с помощью другого селектора.

Но не совсем понятно, чтоВы действительно пытаетесь сделать.

...