Wie speichere ich einen globalen Wert (nicht unbedingt eine globale Variable) in jQuery?

80

Derzeit arbeite ich an einer älteren Webseite, die eine Menge JavaScript, jQuery, Microsoft Client JavaScript und andere Bibliotheken verwendet. Fazit: Ich kann nicht die gesamte Seite von Grund auf neu schreiben, da das Unternehmen dies nicht rechtfertigen kann. Also ... es ist was es ist. Wie auch immer, ich muss den globalen Namespace mit einer Variablen verschmutzen (ich habe es wirklich nicht versucht). Es gibt die drei Optionen, über die ich nachgedacht habe -

  1. Speichern / Abrufen mit einer normalen JavaScript-Deklaration - var x = 0;

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

  3. Verwenden Sie ein ausgeblendetes Formularfeld und legen Sie den Wert mit jQuery fest. $("whatever").data("x", 0);

Gibt es einen besseren Weg? Ich habe mir den vorhandenen Codestapel angesehen und glaube nicht, dass die Variable in einer Funktion erfasst werden kann.

Kris Krause
quelle

Antworten:

100

Sie können einen Namespace innerhalb des jQuery-Objekts erstellen, wie folgt:

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

oder:

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

Beachten Sie, dass jede Plugin-Methode mit dem Namen "mynamespace" überschrieben wird. Verwenden Sie daher unbedingt einen vernünftigen Namen.

karim79
quelle
1
Warum sollte die Namespace-Variable als Attribut von jQuery deklariert werden?!
Pedro Rolo
5
@Pedro - Das muss nicht sein. Ich habe dies nur als eine Möglichkeit herausgestellt.
Karim79
Wenn ich dies verwenden möchte, wo muss ich es deklarieren? Mein gesamter Javascript-Code befindet sich in einer JS-Datei. Ich möchte keinen JavaScript-Code mit HTML-Code mischen.
VansFannel
Dies ist eine dumme Lösung, bei der es zu Namenskonflikten zwischen den deklarierten Namespaces und den Variablen und Methoden des jQuery-Objekts kommen kann. Ich verstehe den Wert dieser Lösung nicht. Für mich ist es nicht gut.
Pedro Rolo
Ich kann diese globale Variable für alle übergeordneten Iframe-Formulare verwenden.
Thulasiram
38

Für mich ist der beste Weg, um mit dieser Situation umzugehen, ein Objekt im Fensterobjekt zu definieren:

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

Dies würde Ihr Zielfernrohr sauber und ordentlich halten. Und wann immer Sie mit window.my_configjedem, der sich den Code ansieht, auf das Globale zugreifen, wissen Sie, dass auf ein Globales zugegriffen wird.

ovais.tariq
quelle
4
Dies ist für mich sinnvoller als die Verwendung des JQuery-Namespace. Gibt es einen Grund, warum dieser Weg nicht genauso gut oder besser funktionieren würde?
Damon
6

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

MyNamepace={}
MyNamespace.newvar = 'value'
// MyNamespace.newvar => 'value'
Pedro Rolo
quelle
Dies ist eine dumme Lösung, bei der es zu Namenskonflikten zwischen den deklarierten Namespaces und anderen globalen Variablen und Methoden kommen kann. 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 nicht die Kontrolle über die Methoden und Variablennamen haben, die bei der Aktualisierung zu jQuery hinzugefügt werden könnten. Dies ist einer der Hauptgründe, warum Namespaces in vielen Sprachen explizit existieren. Wenn sie dies nicht tun, werden Namen merkwürdig (dh: Klassennamen von Smalltalk-Systemen)
Pedro Rolo
4
Nicht immer. Nichts hindert eine Schurkenbibliothek daran, Ihren Hash zu überschreiben. Im Wesentlichen können Sie das Problem nicht ohne expliziten Namespace vermeiden . Aus diesem Grund empfiehlt die Authoring-Dokumentation des jQuery-Moduls einen einzelnen Hash im jQuery-Objekt für Namespace-Zwecke, da der jQuery-Namespace de facto auf gängige Plugins beschränkt ist.
Tad
2

Wenn ich nur meine Praxis mit Ihnen teile, würde ich ein globales Objekt / eine globale Variable in der erforderlichen JavaScript-Datei mit einem sinnvollen Präfix erstellen, als würde ich an einer Seite arbeiten, auf der dieses Objekt ein Textfeld sein wird, dann würde ich es benennen:

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 z.

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 ihrer Initialisierung auf der gesamten Website zur Verfügung.

Ich hoffe das hilft.

Umair Jabbar
quelle
0

Verwenden Sie einen Unterstrich isEmpty().

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

Eldad
quelle
0

Nur eine kurze Nachricht:

Führt die Fancybox AJAX aus (dh wenn sie in einem iFrame geladen wird, sollten Sie der Methode close "parent" hinzufügen), wie folgt:

parent.$.fancybox.close();
Moriz
quelle