2009-07-08 17 views
1
/************************************************************************** 
* 
* Function: toggleVis 
* 
* Description: Following Function hides and expands the main column. 
*    
* 
***************************************************************************/ 
// Set the default "show" mode to that specified by W3C DOM 
// compliant browsers 

    var showMode = 'table-cell'; 


// However, IE5 at least does not render table cells correctly 
// using the style 'table-cell', but does when the style 'block' 
// is used, so handle this 

    if (document.all) showMode='block'; 

// This is the function that actually does the manipulation 

var States = { }; 

function toggleVis(col){ 

    if (!States[col] || States[col].IsOpen == null) 
    { 
     States[col] = {isOpen : true}; // This assumes the cell is already shown 
     //States[col] = {isOpen : false}; // This assumes the cell is already hidden 
    } 

    //mode = States[col].IsOpen ? showMode : 'none'; 
    mode = States[col].IsOpen ? 'none' : showMode; //starts from closed, next click need open 

    cells = document.getElementsByName(col); 
    for(j = 0; j < cells.length; j++) cells[j].style.display = mode; 

    States[col].IsOpen = !States[col].IsOpen; 
} 

この関数は、htmlテーブルの列を非表示にします。 この関数を呼び出すと、それに応じてオブジェクトの状態が切り替わります。展開されている場合はtrue、非表示の場合はfalseです。関数が一度実行された後、再び呼び出されると、この関数で使用できるように状態の最後の状態を保存するのは何ですか?オブジェクトステート{}がグローバルとして宣言されているからですか?グローバルなJavascriptオブジェクトはどのように状態を保存しますか?

答えて

2

はい。最も外側のクロージャーにはStatesを定義します。つまり、実際にはwindowオブジェクトのプロパティ、つまりwindow.States === Statesを意味します。しかし、あなたはその関数のローカルとして新たに定義されているので、

function foo(param) { 
    var States = param; 
} 

それがグローバル状態変数に影響を与えないように関数を定義することができました。 (ただし、その関数内でwindow.Statesを使用してグローバルステート変数にアクセスすることもできます)。

+0

したがって、関数内で操作されてもglobaに影響を与えない場合、関数 "States [col] .IsOpen =!States [col] .IsOpen;"の最後に状態が切り替わると、 次回に呼び出されたときに関数の先頭に何があるのか​​、どうやって知っていますか? –

+0

あなたの場合、関数内で状態を再定義しないので、グローバルに影響します。 – AKX

1

絶対に正しいです。状態はグローバル名前空間で宣言され、(同じ名前の変数でそれを隠さない)すべてのjavascript関数で使用できます。それはそれを使用する関数の外でそれを保持します。

1

javascriptのグローバル変数は、ページがリフレッシュまたはアンロードされるまでアクティブです。

0

はい、それらはリフレッシュするまでアクティブです。 これは私の問題です。すべてのポップアップ(つまり、保存されていない入力フォーム)をグローバル配列に保存しますが、リフレッシュ後、ポップアップ配列の内容が空であるため、ポップアップを取得できません。ブラウザには、ブラウザ全体にデータ構造を格納できる領域がありますか?

+0

クッキーは私が使い終わったものです –

関連する問題