2014-02-15 5 views
-1

Я написал следующий блок кода, и она работает в моем сценарии, но я знаю, что это грязный:Как реализовать ленивую загрузку для селектора jQuery внутри модуля JavaScript?

var navbarModule = (function($) { 
    var self = {}; 
    var $login; 

    self.hideLogin = function() { 
     $login.hide(); 
    }; 

    self.showLogin = function() { 
     $login.show(); 
    }; 

    $(document).ready(function() { 
     $login = $(".navbar-form"); 
    }); 

    return self; 
}(jQuery)); 

Мои цели для кода являются:

  1. Только выберите элемент DOM, если это необходимо
  2. Cache выбранный DOM элемент
  3. гарантия, что кэшируются DOM элемент существует

Мой код не достигает # 1, достигает # 2 и косвенно достигает # 3. I.e., для требования № 3 navbarModule.hideLogin() работает, если DOM полностью загружен, но нет, если вы вызываете его до того, как navbar присутствует в DOM.

Есть ли способ достичь истинной ленивой загрузки и кеширования, которая соответствует моим целям без участия в работе?

+1

Попробуйте это для «истинных» ленивых селекторов загрузки: http://www.bucketsoft.com/blog/post/lazy-loading-jquery-selector –

+0

Неясно, в чем проблема, с которой вы хотите получить помощь. Вы просто вызываете '.hideLogin()' или '.showLogin()' перед тем, как DOM готов? Что означает «только выбрать элемент DOM, если необходимо»? Где вы хотите гарантировать, что кешированный элемент DOM существует? В какой части кода. У этого вопроса недостаточно информации для нас, чтобы узнать, с чем вам нужна помощь. – jfriend00

+0

@ jfriend00 Для # 1 моя цель - не выполнять селектор для навигационной панели вообще, если вызываются только hideLogin или showLogin. Если вызывается любая из функций, я хочу кэшировать навигационную панель, чтобы, если какая-либо функция вызывается более одного раза, я больше не запускаю селектор jQuery. –

ответ

1

ОК, теперь, когда вы объяснили, что вы имеете в виду ленивым кэширования, вы можете сделать это:

var navbarModule = (function($) { 
    var self = {}; 
    var $login; 

    function getLogin() { 
     if (!$login || $login.length == 0) { 
      $login = $(".navbar-form"); 
      return $login; 
     } 
    } 

    self.hideLogin = function() { 
     getLogin().hide(); 
    }; 

    self.showLogin = function() { 
     getLogin().show(); 
    }; 

    return self; 
}(jQuery)); 

Примечание:

Если вы звоните .showLogin() или .hideLogin(), прежде чем есть .navbar-form", то ничего не случится. Он создаст пустой объект jQuery, а методы .hide() и .show() просто ничего не сделают. Если вы снова вызовете это позже, он увидит, что объект jQuery пуст, и снова найдите ".navbar-form".

Непонятно, почему вы считаете, что кеширование объекта входа в систему требуется даже здесь. Дайте ему значение id и просто найдите его по запросу с document.getElementById(), и он будет очень быстрым.

+0

Да, это имеет смысл. Спасибо. –

+0

Мой вопрос был больше из любопытства, чем для достижения определенной цели производительности. Я согласен, что идиоматического получения элемента по ID будет достаточно. –

 Смежные вопросы

  • Нет связанных вопросов^_^