2010-12-14 12 views
0

は、私は非常に単純なjsのは、divの表示を切り替えるように機能する必要があり、ここでの作業バージョンです。今、私はページ上に複数のdivがあり、ユーザーが新しいdivを開いたときに、以前にdivを開いたままにしたいと思っています。私はこのように私の機能を変更することによって、それを実行しようとしました:prev_objの値は、それが動作私はハードコードJS変数問題

var prev_obj = 'empty'; 

function Toggle(obj) { 
    var state = document.getElementById(obj); 
    if (state.style.display === 'block') { 
     state.style.display = 'none'; 
    } 
    else { 

       if (prev_obj !== 'empty') 
       { 
     var prev_state = document.getElementById(prev_obj) 
     prev_state.style.display = 'none'; 
       }  
     state.style.display = 'block'; 

       prev_obj = obj; 
    } 
} 

私は、これはそこJSウィザードに自明であると思うので、私はちょうど言いますよ、しかし、私はそうではないとき、それは初期値( "空")を保持していることを火かき棒が示しています

あなたが持っている場合、これを行うために他の方法と同様に助けていただきありがとうございます。

+0

jQueryのは、溶液のために使用することができますか? –

+0

このコードは動作するはずです... prev_objがグローバルに宣言されていることを確認してください。簡単なテストのために、prev_objの宣言から 'var'を削除してみてください。 (これはグローバルなものでなければならないものです...) – Hersheezy

+0

'Toggle'関数はどのように呼び出されていますか? –

答えて

0

私がコメントで書いたように、私はそれが動作するはずのように見えるとしての機能が正しく呼び出されていると思われます。

もう1つの注意点として、論理を簡略化するには、「」と言っても同じことが考えられる場合は、前のdivを(現在のdivと同じ場合を含めて)閉じます。以前のものと異なる場合は、現在のdivのみを開きます "。

IDの代わりにprev_objに実際の要素を格納し、最初にnullに設定します。 prev_objがあればテストを行い、必要に応じて "空"のIDを使用することもできます(もちろんそうではありませんが、ベストプラクティス)。

var prev_obj = null; 

function Toggle(id) { // Call it "id" to be clear it's not the actual object 
    // Hide previous object if it exists 
    if (prev_obj) prev_obj.style.display = 'none'; 

    // Show current object if it's the same as the previous one 
    var obj = document.getElementById(id); 
    if (obj !== prev_obj) { 
     obj.style.display = 'block'; 
     prev_obj = obj; 
    } 
} 

あなたはIDの周りの単一引用符を含めることによって、それを呼び出すことを確認してください:

<div onclick="Toggle('div-id-here')"></div> 
0

提供された詳細から問題がどこにあるかを知ることは困難です。以下にリンクされたチュートリアルでソリューションを開発できるはずです。個人的には、すべてのdivをループしてすべてを隠し、最後のdivへの参照を保持する代わりに現在のものを表示します。

http://www.randomsnippets.com/2008/02/12/how-to-hide-and-show-your-div/

+0

このリソースをありがとう。私はかなりjsに新しいので、申し訳ありませんので、申し訳ありませんが、10 divをループすることは、特定のdivを閉じることよりも優れていますか? – CodeVirtuoso

+0

@Freelancer - これは必ずしも良いとは限りませんが、概念化するのが簡単だと思います。特に、jQueryの世界では、ループを書く必要がありません。つまり、すべてのdivを非表示にするステートメントと、それらのうちの1つを表示するステートメントです。そのようにミスをするのは難しいですが、いいえ、必ずしも良いとは限りません。 –

+0

@Freelancer @ box9は、概念化が容易だと述べています。パフォーマンスの向上が必要であることがテストによって示されている場合を除いて、パフォーマンスの向上よりも複雑さの削減が重要です。 –