2010-05-19 17 views
80

Obecnie pracuję nad starszą stroną internetową, która używa mnóstwa JavaScript, jQuery, klienta JavaScript firmy Microsoft i innych bibliotek. Najważniejsze - nie mogę przepisać całej strony od zera, ponieważ firma nie może tego uzasadnić. A więc ... tak właśnie jest. W każdym razie, muszę zanieczyszczać (naprawdę nie próbowałem) globalną przestrzeń nazw za pomocą zmiennej. Istnieją trzy opcje Myślałam o -Jak zapisać wartość globalną (niekoniecznie zmienną globalną) w jQuery?

  1. Wystarczy sklep/pobrać go za pomocą zwykłego oświadczenia JavaScript - var x = 0;

  2. użyć jQuery aby zapisać/odczytać wartość w tagu Dom - $("body").data("x", 0);

  3. pomocą ukrytego pola formularza, i ustawić/pobrać wartość z jQuery - $("whatever").data("x", 0);

Czy istnieje lepszy sposób? Spojrzałem na istniejący stos kodu i nie sądzę, aby zmienna mogła mieć zasięg w funkcji.

Odpowiedz

100

Można utworzyć nazw wewnątrz obiektu jQuery, tak:

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

czyli

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

Należy pamiętać, każda metoda plugin o nazwie 'MyNamespace' zostaną zastąpione więc mieć pewność, używać rozsądnej nazwy.

+1

dlaczego zmienna nazw zadeklarowane jako atrybut jQuery ?! –

+5

@Pedro - To nie musi być. Po prostu wskazałem to jako jedną możliwość. – karim79

+0

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

6

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

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

ten to głupie rozwiązanie, w którym można nazwać starcia między zadeklarowanymi przestrzeniami nazw i innymi globalnymi zmiennymi i metodami. Nie rozumiem wartości tego rozwiązania. Dla mnie to jest do bani. – tad

+1

Masz kontrolę nad tym, które nazwy istnieją w zakresie globalnym, podczas gdy nie masz kontroli nad metodami i nazwami zmiennych, które mogą być dodane do jQuery podczas aktualizacji. Jest to jeden z głównych powodów, dla których przestrzenie nazw jawnie istnieją w wielu językach. Gdy tak nie jest, nazwy zaczynają się dziwne (tj .: Smalltalk-systemami klasy nazw) –

+4

Nie zawsze. Nic nie powstrzyma jakiejś zbójeckiej biblioteki przed przesłonięciem hasza. Zasadniczo nie można uniknąć problemu _ bez jawnego wyświetlania nazw. Dlatego dokumentacja do tworzenia modułów jQuery zaleca jeden skrót w obiekcie jQuery do celów tworzenia przestrzeni nazw, ponieważ przestrzeń nazw jQuery jest _de facto_ ograniczona do popularnych wtyczek. – tad

2

sprawiedliwy podział moją praktykę z tobą, chciałbym zrobić globalny obiekt/var w wymaganej JavaScript złożyć sensowną prefiks, jak na razie pracuję na stronie, na której obiekt zostanie pole tekstowe to chciałbym nazwać 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żna również przestrzeń nazw, takich 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.

38

Dla mnie najlepszym sposobem radzenia sobie z tej sytuacji jest zdefiniowanie obiektu w obiektu window:

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

byłoby to zachować swój zakres schludny i czysty. I zawsze, gdy chcesz uzyskać dostęp do globalnego przy użyciu window.my_config każdy, kto patrzy na kod, wie, że dostęp do globalnej jest.

+4

ma to dla mnie więcej sensu niż używanie przestrzeni nazw jQuery. Czy istnieje jakiś powód, dla którego ta metoda nie działałaby tak dobrze czy lepiej? – Damon

0

Wystarczy krótka informacja: Czy fancybox jest AJAX (czyli ładuje ramach iFrame, należy dodać „rodzica” do ścisłej metody, na przykład: js parent.$.fancybox.close();

Powiązane problemy