2014-01-14 35 views
0

如何關閉當前點擊觸發器時打開div或其他觸發器(打開頁面上的其他事件)的div?無論點擊哪個觸發器,總是關閉當前div

所以基本我有兩個鏈接:登錄和註冊。當您單擊註冊時,登錄塊/ div消失並且註冊div顯示。當我點擊登錄時,Register div隱藏並顯示Login div。

另外當我,例如,單擊登錄並登錄div已顯示 - 登錄div必須隱藏。

我該如何做到這一點?我嘗試了幾天,但不幸的是,我是jQuery的初學者,而且我在jQuery方面的技能目前還不是很好。我製作了以下腳本。當你點擊同一個觸發器時,我只能隱藏/顯示div。如果您點擊註冊並登錄,divs將顯示在海誓山盟之上,沒有隱藏。

;(function($) { 
var $jq = jQuery.noConflict(); 
$jq.fn.login_switch = function(options) { 
    var o = $jq.extend({}, $jq.fn.login_switch.defaults, options); 
    var $this = $jq(this); 

    $jq(this).click(function(e) 
    { 
     e.preventDefault(); 
    // hides matched elements if shown, shows if hidden 
    $jq(this).closest("div#wrapper").children("div#member_login").eq(0)[o.method](o.speed); 

    }); 

}; 
$jq.fn.reg_switch = function(options) { 
    var o = $jq.extend({}, $jq.fn.reg_switch.defaults, options); 
    var $this = $jq(this); 

    $jq(this).click(function(e) 
    { 
     e.preventDefault(); 
    // hides matched elements if shown, shows if hidden 
    $jq(this).closest("div#wrapper").children("div#member_reg").eq(0)[o.method](o.speed); 
    }); 

}; 
$jq.fn.login_switch.defaults = { 
    speed : "slow", 
    method: "slideFadeToggle" 
}; 
$jq("a.log-expand").login_switch(); 

$jq.fn.reg_switch.defaults = { 
    speed : "slow", 
    method: "slideFadeToggle" 
}; 
$jq("a.reg-expand").reg_switch(); 


var msie = false; 
if(typeof window.attachEvent != 'undefined') { msie = true; } 

$jq.fn.slideFadeToggle = function(speed, easing, callback) { 
    return this.animate({opacity: 'toggle', height: 'toggle'}, speed, easing, function() { 
    if (msie) { this.style.removeAttribute('filter'); } 
    if (jQuery.isFunction(callback)) { callback(); } 
    }); 
}; 

}; 
})(jQuery); 

我的HTML是:

<div id="member_reg" style="display:none;"> 
     <div class="container"> 
      <div class="sixteen columns"> 
      REGISTRATION. 
      </div> 
     </div> 
    </div> 
    <div id="member_login" style="display:none;"> 
     <div class="container"> 
      <div class="sixteen columns"> 
       LOGIN. 
      </div> 
     </div> 
    </div> 

與觸發按鈕:

<ul class="user"> 
<li><a href="javascript:void(0);" class="reg-expand register">Register</a></li> 
<li><a href="javascript:void(0);" class="log-expand login">Login</a></li> 
</ul> 
+0

能否請你分享你的'HTML'爲'divs'和按鈕? – zgood

+0

你檢查了jQuery中的toggle()方法嗎?你可以使用它輕鬆實現顯示/隱藏元素。 – dinukadev

+0

你在這裏有什麼是過度殺傷 – zgood

回答

1

這裏,我已經爲您創建了FIDDLE與我認爲你正在努力實現的行爲。

讓我知道你是否有任何問題,或者如果我是基地。

HTML

<button id="btnLogin" data-bound="login">Login</button><button id="btnRegister" data-bound="register">Register</button> 

<hr /> 

<div id="login" class="area" data-state="closed"> 
    Login div 
</div> 

<div id="register" class="area" data-state="closed"> 
    Register div 
</div> 

CSS

.area{ 
    float:left; 
    width:200px; 
    height:0; 
    margin:10px; 
    overflow:hidden; 
    text-align:center; 
    line-height:100px; 
} 
#login{ 
    background:#41cc36; 
} 
#register{ 
    background:#3764e3; 
} 

JAVASCRIPT

$(document).ready(function(){ 
    $('button').bind('click', function(){ 
     //close any open areas 
     $('.area').each(function(){ 
      if($(this).data('state') == 'open'){ 
       $(this).animate({'height': 0}, 750, function(){ 
        $(this).data('state', 'closed'); 
       }); 
      } 
     }); 
     //retrieve the div we need to toggle and it's state 
     var divID = $(this).data('bound'), 
      div = $('#' + divID), 
      state = div.data('state'); 
     //animate the div based on it's state, then set the new state 
     if(state == 'closed'){ 
      div.animate({'height': 100}, 750, function(){ 
       div.data('state', 'open'); 
      });    
     }else{ 
      div.animate({'height': 0}, 750, function(){ 
       div.data('state', 'closed'); 
      }); 
     } 
    }); 

    //init 
    $('#btnLogin').trigger('click'); 
}); 
+0

非常感謝您的回答,這正是我努力實現的目標。我注意到的第一件事是你的方法與我的很不一樣。爲什麼如果我可能會問?爲什麼不嘗試使用jQuery的toggle()?此外,我從來沒有嘗試過HTML中的數據綁定和數據狀態。它是HTML5嗎? 順便說一句,所有的容器現在都在頁面加載後關閉。如何顯示#login作爲已經打開的默認容器? – nerdrocker

+0

那麼真的沒有對錯的方法,只是大量不同的方式來編碼相同的東西哈哈。在你的方法中,你正在創建一個類似jQuery的插件,使用'fn',就像'prototype'一樣......參見[here](http://stackoverflow.com/questions/4083351/what-does-jquery-fn-意思)。而我只是直接將點擊事件附加到頁面加載的按鈕上。您的方法更長,但可以在不同的頁面上重複使用代碼。你甚至可以將兩者結合起來,並使用我的代碼方法制作jQuery插件。最好的方法通常取決於項目和你感到舒服。 – zgood

+0

如果你想淡入淡出div,你可以使用'toggle()',但是我的動畫高度(只是因爲我喜歡它的樣子),所以'toggle()'不適合我。 – zgood