Jak przechowywać wartość globalną (niekoniecznie zmienną globalną) w jQuery?

80

Obecnie pracuję nad starszą stroną internetową, która używa mnóstwa JavaScript, jQuery, JavaScript klienta Microsoft i innych bibliotek. Podsumowując - nie mogę przepisać całej strony od nowa, ponieważ firma nie może tego uzasadnić. Więc ... tak właśnie jest. W każdym razie muszę zanieczyścić (naprawdę nie próbowałem) globalną przestrzeń nazw zmienną. Są trzy opcje, o których myślałem -

  1. Po prostu zapisz / pobierz go za pomocą zwykłej deklaracji JavaScript - var x = 0;

  2. Użyj jQuery do przechowywania / pobierania wartości w tagu DOM - $("body").data("x", 0);

  3. Użyj ukrytego pola formularza i ustaw / pobierz wartość za pomocą jQuery - $("whatever").data("x", 0);

Czy jest lepszy sposób? Przyjrzałem się istniejącemu stosowi kodu i nie wierzę, że zmienna może być objęta zakresem funkcji.

Kris Krause
źródło

Odpowiedzi:

100

Możesz stworzyć przestrzeń nazw wewnątrz obiektu jQuery, na przykład:

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

lub:

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

Pamiętaj, że każda metoda wtyczki o nazwie „mynamespace” zostanie nadpisana, więc upewnij się, że używasz rozsądnej nazwy.

karim79
źródło
1
dlaczego zmienna przestrzeni nazw ma być zadeklarowana jako atrybut jQuery ?!
Pedro Rolo
5
@Pedro - Nie musi. Wskazałem na to jako jedną możliwość.
karim79
Jeśli chcę tego użyć, gdzie mam to zadeklarować? Cały mój kod javascript znajduje się w pliku JS. Nie chcę mieszać kodu JavaScript z kodem HTML.
VansFannel
jest to głupie rozwiązanie, w którym często występują konflikty nazw między zadeklarowanymi przestrzeniami nazw a zmiennymi i metodami obiektu jQuery. Nie rozumiem wartości tego rozwiązania. Dla mnie to nie jest dobre.
Pedro Rolo
mogę używać tej zmiennej globalnej we wszystkich elementach nadrzędnych iframe?
Thulasiram
39

Dla mnie najlepszym sposobem na poradzenie sobie z tą sytuacją jest zdefiniowanie obiektu w obiekcie window:

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

Dzięki temu luneta będzie schludna i czysta. A ilekroć miałbyś uzyskać dostęp do globalnego, używając window.my_configkażdego, kto patrzy na kod, wiedziałby, że uzyskiwany jest dostęp do globalnego.

ovais.tariq
źródło
4
ma to dla mnie większy sens niż używanie przestrzeni nazw jquery. Czy jest jakiś powód, dla którego ten sposób nie działałby tak dobrze lub lepiej?
Damon,
6

Możesz utworzyć skrót w zasięgu globalnym i używać go jako przestrzeni nazw:

MyNamepace={}
MyNamespace.newvar = 'value'
// MyNamespace.newvar => 'value'
Pedro Rolo
źródło
Jest to głupie rozwiązanie, w którym często występują konflikty nazw między zadeklarowanymi przestrzeniami nazw a innymi globalnymi zmiennymi i metodami. Nie rozumiem wartości tego rozwiązania. Dla mnie to jest do bani.
tad
1
Masz kontrolę nad nazwami istniejącymi w zasięgu globalnym, ale nie masz kontroli nad metodami i nazwami zmiennych, które mogą zostać dodane do jQuery podczas aktualizacji. Jest to jeden z mocnych powodów, dla których przestrzenie nazw jawnie istnieją w wielu językach. Kiedy tak nie jest, nazwy zaczynają być dziwne (np .: nazwy klas Smalltalk-systems)
Pedro Rolo
4
Nie zawsze. Nic nie powstrzymuje nieuczciwej biblioteki przed zastąpieniem twojego skrótu. Zasadniczo nie można uniknąć tego problemu bez jawnej przestrzeni nazw. Dlatego w dokumentacji dotyczącej tworzenia modułu jQuery zaleca się użycie pojedynczego skrótu w obiekcie jQuery do celów przestrzeni nazw, ponieważ przestrzeń nazw jQuery jest de facto ograniczona do popularnych wtyczek.
tad
2

Dzieląc się z wami swoją praktyką, zrobiłbym globalny obiekt / zmienną w wymaganym pliku JavaScript z rozsądnym prefiksem, tak jakbym pracował na stronie, na której ten obiekt będzie polem tekstowym, to nazwałbym go:

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

Jeśli masz więcej niż jedną zmienną globalną, możesz również mieć przestrzeń nazw, taką jak:

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';

Te zmienne będą dostępne w całej witrynie po ich zainicjowaniu.

Mam nadzieję, że to pomoże.

Umair Jabbar
źródło
0

Krótka informacja:

Czy fancybox wykonuje AJAX (co oznacza: jeśli ładuje się w ramach iFrame, należy dodać „parent” do metody close), na przykład:

parent.$.fancybox.close();
Moriz
źródło