【问题标题】:Is there a shorter way to write this jquery toggle code?有没有更短的方法来编写这个 jquery 切换代码?
【发布时间】:2014-02-05 12:06:43
【问题描述】:
    $('#checkout #button-method').on('click', function() {
        $('#button-info').removeClass('pressed').addClass('pointer');
        $('#button-method').addClass('pressed').removeClass('pointer');     
        $('#shipping-info').addClass('hide');
        $('#shipping-method').addClass('add');
    });
    $('#checkout #button-info').on('click', function() {
        $('#button-info').addClass('pressed').removeClass('pointer');
        $('#button-method').removeClass('pressed').addClass('pointer');     
        $('#shipping-info').removeClass('hide');
        $('#shipping-method').removeClass('add');
    });

类 'pointer' 的 CSS 是 cursor:pointer;对于类“按下”是背景颜色的变化;对于“隐藏”类,显示:无;对于“添加”类,显示:块

有 2 个按钮(按钮方法和按钮信息)。单击按钮方法时,按钮信息被禁用,运输信息隐藏,运输方法出现。单击按钮信息时,会发生相反的过程。有没有办法在两个不同的元素上使用 toggleClass 来压缩这段代码?

【问题讨论】:

  • 好吧,我将从缓存这些元素开始。由于 id 是唯一的,您可以简单地获取 id,无需像 #checkout #button-method 那样查询
  • 简短回答:是的。长答案,您可以更新您的 HTML 结构以允许稍微少一点的 JS 来做同样的事情。问题是:值得花时间让你的 JS 缩短一两行吗?
  • Bic 和 Andre 我喜欢你的代码示例。唯一的问题是按下的按钮仍然可以切换。我上面的代码使得在点击时,在按下另一个按钮之前没有与按下的交互。您将如何编织该功能,也许使用禁用?
  • @matenji 我修改了答案中最短的解决方案。您只需要检查单击的按钮是否还没有按下的类。

标签: javascript jquery css toggle


【解决方案1】:

更新:4 行 jQuery。

当然还有更好的方法。从我的观点来看,这是最好的方法。

在此处查看代码:http://jsfiddle.net/ALsYT/10/

我所做的是将它们放在一个“按钮”变量中,并且由于一个开始隐藏,你必须在加载时执行,我只是使用 CSS 作为示例,并同时在两者上使用切换,我总是在它们之间交换。

HTML:

<button id="button-info" class="green">Button info</button>
<button id="button-method" class="red">Button Method</button>
<br /> <br />
<button id="shipping-info">Shipping info</button>
<button id="shipping-method">Shipping Method</button>

jQuery:

var buttons = $("#button-info, #button-method").on("click", function(){   
    $(buttons).toggleClass('red green');
    var buttons_to_toggle = $("#shipping-info, #shipping-method").toggle();
});

CSS:

.red {background-color:red}
.green {background-color:green}
#shipping-info { display:block; }
#shipping-method { display:none; }

【讨论】:

  • 是的。这只是一个简单的示例,我将更新 jsfiddle!完成!
  • 小记,你将一个jQuery对象保存为buttons,然后从buttons创建一个jQuery对象。在事件处理程序中,您不需要将buttons$() 包装起来。
  • 它确实是开销,在这种情况下双向工作。感谢您的说明。
【解决方案2】:

你可以像这样使用 toggleClass:

function toggle(condition)
{
    $('#button-info').toggleClass('pressed', !condition).toggleClass('pointer', condition);
    $('#button-method').toggleClass('pressed', condition).toggleClass('pointer', !condition);     
    $('#shipping-info').toggleClass('hide', condition);
    $('#shipping-method').toggleClass('add', condition);
}

$('#button-method').on('click', function() {
    toggle(true);
});
$('#button-info').on('click', function() {
    toggle(false);
});

如果你真的想压缩代码,你可以改变你的 html 和 css 从而减少类的改变。

【讨论】:

    【解决方案3】:

    您使用 toggleClass() 来交换类:

    $('#button-method').on('click', function() {
        $('#button-info').toggleClass('pressed pointer');
        $(this).toggleClass('pressed pointer');     
        $('#shipping-info, #shipping-method').toggleClass('hide add');
    });
    $('#button-info').on('click', function() {
        $(this).toggleClass('pressed pointer');
        $('#button-method').toggleClass('pressed pointer');     
        $('#shipping-info, #shipping-method').toggleClass('hide add');
    });
    

    这是Fiddle Demo

    您的 shipping-info 和 shipping-method 类似乎相同。如果是这种情况,您可以将它们模块化在一种方法中,这样您就可以将代码放在一个地方。我认为这是一个错误并相应地编写了解决方案。

    你可以用一排按钮切换来进一步压缩它:

    $('#button-method').on('click', function() {
        $('#button-method, #button-info').toggleClass('pressed pointer');
        $('#shipping-info, #shipping-method').toggleClass('hide add');
    });
    $('#button-info').on('click', function() {
        $('#button-info, #button-method').toggleClass('pressed pointer');     
        $('#shipping-info, #shipping-method').toggleClass('hide add');
    });
    

    此时处理程序变得相同,因此您可以将相同的处理程序绑定到两个按钮:

    $('#button-info, #button-method').on('click', function() {
        if (!$(this).hasClass('pressed')) {
            $('#button-method, #button-info').toggleClass('pressed pointer');
            $('#shipping-info, #shipping-method').toggleClass('hide add');
        }
    });
    

    【讨论】:

    • 此解决方案依赖于在页面初始加载时具有给定类的组之一。如果您最初需要启动类,您可以使用 $.one 来处理初始按钮单击,并在该处理程序中绑定后续单击处理程序。
    • @matenji 我根据对您原始帖子的评论修改了答案。请注意,您可以使用 disabled 来终止按钮,以便它不会触发事件,但样式可能不适用于所有浏览器。我知道某些版本的 IE 不允许您在禁用元素时为其设置样式。
    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 2020-03-14
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多