2010-05-19 1 views
80

Derzeit arbeite ich an einer alten Webseite, die eine Menge JavaScript, jQuery, Microsoft-Client-JavaScript und andere Bibliotheken verwendet. Die Quintessenz - Ich kann nicht die gesamte Seite von Grund auf neu schreiben, da das Geschäft es nicht rechtfertigen kann. Also ... es ist was es ist. Wie auch immer, ich muss den globalen Namespace mit einer Variablen verschmutzen (ich habe es auch wirklich nicht versucht). Es sind die drei Optionen, die ich darüber nachdachte -Wie speichert man einen globalen Wert (nicht unbedingt eine globale Variable) in jQuery?

  1. Nur store/abrufen es eine normale JavaScript Erklärung mit - var x = 0;

  2. Verwenden jQuery den Wert in einem DOM-Tag speichern/abrufen - $("body").data("x", 0);

  3. ein verborgenes Formularfeld verwenden, und setzen/den Wert mit jQuery abrufen - $("whatever").data("x", 0);

Gibt es einen besseren Weg? Ich schaute auf den vorhandenen Stapel Code, und ich glaube nicht, dass die Variable in einer Funktion beschränkt werden kann.

Antwort

100

Sie einen Namespace innerhalb des jQuery-Objekt erstellen können, etwa so:

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

oder:

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

Beachten Sie, jede Plugin-Methode 'MyNamespace' genannt wird, so sicher sein, werden überschrieben um einen vernünftigen Namen zu verwenden.

+1

Warum sollte die Namespace-Variable als Attribut von jQuery deklariert werden ?! –

+5

@Pedro - Es muss nicht sein. Ich habe das nur als eine Möglichkeit aufgezeigt. – karim79

+0

Wenn ich das nutzen will, wo muss ich es deklarieren? Alle meine JavaScript-Code ist in einer JS-Datei. Ich möchte JavaScript-Code nicht mit HTML-Code mischen. – VansFannel

6

Sie können einen Hash im globalen Bereich erstellen und als Namespace verwenden:

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

This ist eine alberne Lösung, die dazu neigt, Konflikte zwischen den deklarierten Namespaces und anderen globalen Variablen und Methoden zu benennen. Ich verstehe den Wert dieser Lösung nicht. Für mich ist es scheiße. – tad

+1

Sie haben die Kontrolle darüber, welche Namen im globalen Bereich vorhanden sind, während Sie keine Kontrolle über die Methoden und Variablennamen haben, die jQuery beim Update hinzugefügt werden können. Dies ist einer der Hauptgründe, warum Namespaces in vielen Sprachen explizit existieren. Wenn sie dies nicht tun, beginnen Namen merkwürdig zu werden (z. B. Smalltalk-systems Klassennamen) –

+4

Nicht immer. Es gibt nichts, was eine Rogue-Bibliothek daran hindert, den Hash zu überschreiben. Im Wesentlichen können Sie das Problem _ohne expliziten Namespacing nicht vermeiden. Aus diesem Grund empfiehlt die jQuery-Modul-Authoring-Dokumentation einen einzelnen Hash im jQuery-Objekt für Namespacing-Zwecke, da der jQuery-Namespace _de facto_ auf populäre Plugins beschränkt ist. – tad

2

Nur mit Ihnen meine Praxis teilen, würde ich ein globales Objekt/var in der erforderlichen JavaScript mit einem vernünftigen Datei machen Präfix, wie wenn ich auf einer Seite arbeite, wo dieses Objekt ein Textfeld sein wird, dann würde ich es nennen:

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

wenn Sie mehr als eine globale Variable haben, können Sie auch einen Namespace haben, wie:

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

Diese Variablen stehen Ihnen nach der Initialisierung auf der gesamten Website zur Verfügung.

Ich hoffe, das hilft.

38

Für mich der beste Weg, um diese Situation zu handhaben ist ein Objekt im Fensterobjekt zu definieren:

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

Dieser Ihr Umfang ordentlich und sauber halten würde. Und wann immer Sie mit window.my_config auf den globalen Zugriff zugreifen würden, würde jeder, der den Code betrachtet, wissen, dass auf einen globalen Zugriff zugegriffen wird.

+4

das macht mehr Sinn als jquery Namespace. Gibt es einen Grund, warum dieser Weg nicht genauso gut oder besser funktioniert? – Damon

0

Nur eine kurze Mitteilung: Ist fancybox AJAX ist (was bedeutet, es innerhalb eines iFrame lädt, sollten Sie „Eltern“ auf die enge Methode hinzufügen, wie folgt aus: js parent.$.fancybox.close();

0

Nutzung unterstreichen isEmpty().

_.isEmpty('') wird true zurückgeben.