グローバル値(必ずしもグローバル変数である必要はありません)をjQueryに保存する方法は?


80

現在、大量のJavaScript、jQuery、MicrosoftクライアントJavaScript、およびその他のライブラリを使用するレガシーWebページに取り組んでいます。結論-ビジネスがそれを正当化できないので、私はページ全体を最初から書き直すことはできません。だから...それはそれが何であるかです。とにかく、変数でグローバル名前空間を汚染する必要があります(私も実際には試しませんでした)。私が考えていた3つのオプションがあります-

  1. 通常のJavaScript宣言を使用して保存/取得するだけです- var x = 0;

  2. jQueryを使用して値をDOMタグに保存/取得します- $("body").data("x", 0);

  3. 非表示のフォームフィールドを使用し、jQueryで値を設定/取得します- $("whatever").data("x", 0);

もっと良い方法はありますか?私は既存のコードの山を調べましたが、変数を関数内でスコープできるとは思いません。

回答:


100

次のように、jQueryオブジェクト内に名前空間を作成できます。

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

または:

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

'mynamespace'という名前のプラグインメソッドはすべて上書きされるため、わかりやすい名前を使用してください。


1
名前空間変数をjQueryの属性として宣言する必要があるのはなぜですか?!
ペドロロロ2010年

5
@ Pedro-そうである必要はありません。私はこれを1つの可能性として指摘していました。
karim79 2010年

これを使用したい場合、どこで宣言すればよいですか?私のJavaScriptコードはすべてJSファイルにあります。JavaScriptコードとHTMLコードを混在させたくありません。
vansFannel

これは、宣言された名前空間とjQueryオブジェクトの変数およびメソッドの間で名前の衝突が発生しやすいというばかげた解決策です。このソリューションの価値がわかりません。私にとって、それは良くありません。
ペドロロロ2011

このグローバル変数をすべてのiframeフォームの親で使用できますか?
トゥラシラム

39

私にとって、この状況を処理する最良の方法は、ウィンドウオブジェクトでオブジェクトを定義することです。

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

これにより、スコープがすっきりときれいに保たれます。そしてwindow.my_config、コードを見ている人を使ってグローバルにアクセスするときはいつでも、グローバルがアクセスされていることを知っているでしょう。


4
これは、jquery名前空間を使用するよりも私には理にかなっています。この方法がうまく機能しない理由はありますか?
デイモン2011

6

グローバルスコープでハッシュを作成し、それを名前空間として使用できます。

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

これは、宣言された名前空間と他のグローバル変数およびメソッドの間で名前の衝突が発生しやすいというばかげた解決策です。このソリューションの価値がわかりません。私にとって、それは最悪です。
tad 2011

1
グローバルスコープに存在する名前は制御できますが、更新時にjQueryに追加される可能性のあるメソッドと変数名は制御できません。これは、名前空間が多くの言語で明示的に存在する大きな理由の1つです。そうでない場合、名前は奇妙になり始めます(つまり、Smalltalk-systemsクラス名)
Pedro Rolo 2011

4
常にではない。不正なライブラリがハッシュをオーバーライドするのを妨げるものは何もありません。本質的に、明示的な名前空間なしでは問題回避することはできません。これが、jQuery名前空間が事実上一般的なプラグインに制限されているため、jQueryモジュールのオーサリングドキュメントが名前空間の目的でjQueryオブジェクト内の単一のハッシュを推奨している理由です。
tad

2

私の練習をあなたと共有するだけで、このオブジェクトがテキストボックスになるページで作業している場合のように、必要なJavaScriptファイルに適切なプレフィックスを付けてグローバルオブジェクト/変数を作成します。

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

複数のグローバル変数がある場合は、次のような名前空間を使用することもできます。

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

これらの変数は、初期化された後、Webサイト全体で利用できるようになります。

これがお役に立てば幸いです。



0

ちょっとした通知:

fancyboxはAJAXを実行していますか(つまり、iFrame内にロードする場合は、closeメソッドに「親」を追加する必要があります)。

parent.$.fancybox.close();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.