2010-10-18 3 views
0

Я относительно новичок в javascript, поэтому, пожалуйста, будьте терпеливы, если то, что я прошу, абсолютно глупо!Javascript scope help

Я пытаюсь сделать простой модуль. Внутри модуля я хочу иметь объект конфигурации, который содержит настройки для модуля. Я также использую jquery. Селекторы jquery работают только в том случае, если функция непосредственно находится в основном объекте/модуле.

Я понимаю, что у javascript есть функциональная область, поэтому я удивлен тем, что не могу использовать селектора jquery в любом месте внутри модуля.

EDIT: Я хочу, чтобы иметь возможность напрямую устанавливать все мои конфиги внутри объекта configs с помощью селекторов jquery. Таким образом, я держу все беспорядочные вещи внутри одного места и могу получить доступ к configs.whatever всюду по остальной части модуля. В настоящий момент селектора jquery не работают внутри модуля configs.

var OB = function() { 

    var configs = { 
     'mode' : 'test', 
     'numOfSelects' : $('.mySelect').find('select').length, // This doesnt work 
    } 

    var getMode = function() { 
     return configs.mode; 
    } 

    function init() { 
     alert(configs.numOfSelects); // This alerts 0 until the following line 
     alert($('.mySelect').find('select').length); // This correctly alerts 2 
    }; 

    var handlers = { 
     successHandler : function() { 
      alert("Success"); 
     }, 
     errorHandler : function() { 
      alert("error"); 
     } 
    } 

    return { 
     init : init, 
     getMode : getMode 
    } 

}(); 

$(document).ready(function(){ 
    OB.init(); 
}); 
+1

Не могли бы вы отредактировать это, чтобы включить именно ваш вопрос? Что вы ожидаете? Что вы уже пробовали? Какие результаты вы получаете? Как мы можем помочь? Какой ваш любимый цвет? Спасибо :) – Aardvark

+0

Селектор jQuery является глобальным по объему и поэтому должен быть доступен из любого места. Вы уверены, что они недоступны? Каковы симптомы? –

+0

Привет, Марсело. есть два поля выбора, вызываемые в dom с классом .mySelect. Когда я вызываю предупреждение (configs.numOfSelects); в примере выше - я получаю 0 Когда я вызываю предупреждение ($ ('. mySelect'). find ('select'). length); который находится в функции init, я получаю правильное количество 2 – David

ответ

1

Это не то, что JQuery не в объеме - это, что код не выполняется, когда вы думаете, , Переменная config определяется, когда выполняется эта анонимная функция (var OB = function() {}()). DOM еще не готов, так что обход DOM ничего не находит. Когда вы выполняете обход DOM в init(), это не выполняется до тех пор, пока оно явно не будет вызвано внутри обработчика $(document).ready(), после чего будет настроен DOM. Это разница, которую вы видите.

+0

Спасибо, патрон. Я знал, что я глуп. Вы не поверите, как долго я пробовал это проработать. – David

+0

Я хочу дать @chuck, @absynce и @marcelo правильный ответ, как вы все указали мне. Но я не могу. – David

1

EDIT: Забавно, что мой первоначальный ответ ниже был неправильным, потому что я не заметил двух маленьких круглых скобок в конце определения OB, и оказывается, что это преступник. Вы определяете, а затем сразу вызываете OB, который находится перед полной загрузкой DOM. Удалите эти круглые скобки и внесите изменения, которые я предлагаю ниже.

Вызов OB() возвращает объект с init и getMode, но вы не заехали OB(), вы только называют OB. Попробуйте это вместо:

$(document).ready(function(){ 
    OB().init(); 
}); 

Кроме того, предполагается, что вы хотите позже обратиться к getMode. В частности, вы получите копию getMode, которая имеет доступ к той же локальной области, к которой имел доступ ваш вызов init(). Для достижения этой цели, вам нужно будет хранить результат вызова OB() для последующего использования:

var ob; 

$(document).ready(function(){ 
    ob = OB(); 
    ob.init(); 
}); 

function some_other_function() { 
    ... ob.getMode() ...; 
} 
+0

Но я назвал OB(). Я включил открывающую и закрывающуюся скобки в конце функции, как в}(); – David

+0

Глупый я, я не заметил этих круглых скобок. –

+0

Что-то еще мне пришло в голову, одним из основных моментов шаблона модуля является сокращение глобальных переменных. Если у меня есть все инкапсулированное внутри OB, но затем также вводите ob anment i, а затем вводите другой глобальный. хотя, только 1, но stil ... – David

1

OB() необходимо вызвать после полной загрузки DOM. Отсюда ответ Марсело, который вызывает OB() в методе ready().

+0

Aaaahhh !!! Теперь я вижу. Я называю это до того, как dom загрузился, и поэтому нет никаких ящиков для подсчета! – David

+0

Чак, ты избил меня к ней :) Ты тоже лучше описал это. – absynce