Як зберегти глобальне значення (не обов'язково глобальну змінну) у jQuery?


80

На даний момент я працюю на застарілій веб-сторінці, яка використовує купу JavaScript, jQuery, клієнтський JavaScript Microsoft та інші бібліотеки. Підсумок - я не можу переписати всю сторінку з нуля, оскільки бізнес не може це виправдати. Отже ... це те, що воно є. У всякому разі, мені потрібно забруднити (я справді намагався не надто) глобальний простір імен змінною. Є три варіанти, про які я думав -

  1. Просто збережіть / отримайте його, використовуючи звичайну декларацію JavaScript - var x = 0;

  2. Використовуйте jQuery для зберігання / отримання значення в тегу DOM - $("body").data("x", 0);

  3. Використовуйте приховане поле форми та встановлюйте / отримуйте значення за допомогою jQuery - $("whatever").data("x", 0);

Чи є кращий спосіб? Я переглянув існуючу купу коду, і не вірю, що змінну можна застосувати у функції.

Відповіді:


100

Ви можете створити простір імен всередині об'єкта jQuery, наприклад:

$.mynamespace = { 
    myVar : "something", 
    myVar2 : "somethingElse" 
}; 

або:

$.mynamespace = {};
$.mynamespace.myVar = "something";
$.mynamespace.myVar2 = "somethingElse";

Пам’ятайте, будь-який метод плагіна з назвою „mynamespace” буде перезаписаний, тому обов’язково використовуйте розумне ім’я.


1
чому змінна простору імен повинна бути оголошена як атрибут jQuery ?!
Педро Роло,

5
@Pedro - Це не потрібно. Я просто вказував на це як на одну можливість.
karim79

Якщо я хочу використовувати це, де мені це заявити? Весь мій код JavaScript знаходиться у файлі JS. Я не хочу змішувати код JavaScript з кодом HTML.
VansFannel

це безглузде рішення, оскільки воно схильне називати зіткнення між оголошеними просторами імен та змінними та методами jQuery Object. Я не розумію значення цього рішення. Для мене це не добре.
Педро Роло,

я можу використовувати цю глобальну змінну у всіх батьківських формах iframe?
Туласірам,

39

Для мене найкращий спосіб вирішити цю ситуацію - це визначити об'єкт у вікні:

window.my_config =
{
    my_var1 : 1,
    my_var1 : 2,
    my_var1 : 3
};

Це дозволить зробити ваш приціл акуратним і чистим. І кожен раз, коли ви отримуєте доступ до глобального, використовуючи window.my_configкожен, хто дивиться на код, знатиме, що доступ до глобального відбувається.


4
це для мене має більший сенс, ніж використання простору імен jquery. Чи є причина, що такий спосіб не міг би працювати так само добре чи краще?
Деймон

6

Ви можете створити хеш у глобальній області і використовувати його як простір імен:

MyNamepace={}
MyNamespace.newvar = 'value'
// MyNamespace.newvar => 'value'

Це безглузде рішення, оскільки воно схильне називати зіткнення між оголошеними просторами імен та іншими глобальними змінними та методами. Я не розумію значення цього рішення. Для мене це відмовно.
трохи

1
Ви маєте контроль над тим, які імена існують у глобальній області, тоді як у вас немає контролю над методами та іменами змінних, які можуть бути додані до jQuery під час оновлення. Це одна з вагомих причин, чому простори імен явно існують у багатьох мовах. Коли вони цього не роблять, імена починають бути дивними (тобто: Smalltalk-systems class-names)
Педро Роло

4
Не завжди. Ніщо не заважає якійсь негідній бібліотеці замінити ваш хеш. По суті, ви не можете уникнути проблеми без явного простору імен. Ось чому авторська документація модуля jQuery рекомендує один хеш в об’єкті jQuery для цілей простору імен, оскільки простір імен jQuery фактично обмежений популярними плагінами.
тад

2

Просто поділившись з вами своєю практикою, я б створив глобальний об'єкт / var у необхідному файлі JavaScript із розумним префіксом, як якщо б я працював на сторінці, де цей об'єкт буде текстовим полем, я б назвав його:

g_TxtMyValue = 'value';    // g_ specifies it to be a global variable, it is one
                           // of the many conventions used

Якщо у вас є більше однієї глобальної змінної, ви також можете мати простір імен, наприклад:

my_txt = {};  // For a real site I would use a prefix relative to the project
              // name instead of "my".

my_txt.testValueOne = 'Value one';
my_txt.testValueOne = 'Value two';

Ці змінні будуть доступні вам на всьому веб-сайті після їх ініціалізації.

Сподіваюся, це допоможе.



0

Лише коротке повідомлення:

Чи робить fancybox AJAX (мається на увазі: якщо він завантажується всередині iFrame, слід додати "батьківський" до методу close), наприклад:

parent.$.fancybox.close();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.