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.

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.


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.


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'

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.



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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.