【问题标题】:Always close current div regardless of which trigger you click无论您单击哪个触发器,始终关闭当前 div
【发布时间】:2014-01-14 14:57:24
【问题描述】:

如何关闭当前打开的 div,当您单击它的触发器时,该触发器通常会打开 div 或任何其他触发器(在页面上打开不同的事件)?

所以基本上我有两个链接:登录和注册。当您单击注册时,登录块/div 消失,而注册 div 出现。当我点击 Login 时,Register div 隐藏并且 Login div 显示出来。

还有当我,例如单击登录,登录 div 已显示 - 登录 div 也必须隐藏。

我该如何做到这一点?我已经尝试了好几天,但不幸的是我是 jQuery 的初学者,我的 jQuery 技能目前还不是很好。我制作了以下有效的脚本。当您单击相同的触发器时,我只能隐藏/显示 div。如果您单击注册并登录,则 div 将仅显示在彼此之上,而不会隐藏。

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

【问题讨论】:

  • 您能否分享您的HTML 以获取divs 和按钮?
  • 你检查过 jquery 中的 toggle() 方法吗?您可以使用它轻松实现显示/隐藏元素。
  • 你这里的东西有点矫枉过正
  • zgood,就像我说的,我不是 jQuery 专家。我只是从它开始。那么,我怎样才能以不同的方式做到这一点而又不那么矫枉过正呢?
  • 我可以为你做一个小提琴。抱歉,我不是想成为一个混蛋,但我知道它是那样的。

标签: javascript jquery slidetoggle


【解决方案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');
});

【讨论】:

  • 非常感谢您的回答,这正是我试图实现的目标。我注意到的第一件事是您的方法与我的方法大不相同。如果我可以问,为什么会这样?为什么不尝试使用 jQuery 的 toggle() 来实现呢?此外,我之前从未在 HTML 中尝试过数据绑定和数据状态。是 HTML5 吗?顺便说一句,所有容器现在在页面加载后都关闭了。如何将 #login 显示为已打开的默认容器?
  • 嗯,真的没有正确或错误的方式,只是有很多不同的方式来编码相同的东西哈哈。在您的方法中,您正在使用fn 为jQuery 创建一个类似的插件,就像prototype...参见here。而我只是在页面加载时直接将点击事件附加到您的按钮。您的方法更长,但使代码可在不同页面上重用。你甚至可以结合两者并使用我的代码方法制作 jQuery 插件。最好的方法通常取决于项目以及您对什么感到满意。
  • 如果你想淡入淡出 div,你可以使用 toggle(),但我正在制作高度动画(只是因为我喜欢它的外观)所以 toggle() 不适合我。
  • data 是一个 jQuery 事物和一个 HTML5 事物一起工作。基本上,您可以在 HTML 中创建任何自定义属性(如 data-myproperty 或 data-foo),然后通过 jQuery 访问该值,如下所示:$('#someDiv').data('foo'); 或设置值:$('#someDiv').data('foo', 'new value');。如果需要,您还可以使用全局 javascript 变量来存储值,我只是认为这种 data 方法更干净。
  • 我已更新此答案以包含初始的btnLogin 单击,以便在页面首次加载时打开您的登录 div。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
相关资源
最近更新 更多