首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >经济jQuery码

经济jQuery码
EN

Stack Overflow用户
提问于 2015-12-20 17:10:37
回答 2查看 40关注 0票数 0

最后,我常常得到一些类似的、多次重复的jQuery代码块。例如:

代码语言:javascript
复制
$("#showdescription").on("click", function(){
    $('#description_sh').toggleClass("down");
    $("#hiddendescription").toggleClass("hidden");
  });
$("#showrooms").on("click", function(){
        $('#rooms_sh').toggleClass("down");
        $("#hiddenrooms").toggleClass("hidden");
  });
$("#showmeals").on("click", function(){
        $('#meals_sh').toggleClass("down");
        $("#hiddenmeals").toggleClass("hidden");
  });
$("#showout").on("click", function(){
        $('#out_sh').toggleClass("down");
        $("#hiddenout").toggleClass("hidden");
  });
$("#showreviews").on("click", function(){
        $('#reviews_sh').toggleClass("down");
        $("#hiddenreviews").toggleClass("hidden");
  });

我一直在试图找到一种方法将这些代码组合在一起,这样我就有可能将代码降到目前不超过20%的水平。不幸的是,到目前为止,我所有的努力都打破了这一切。我今天觉得很蠢。一定很容易,不是吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-20 17:40:53

我需要看到更多的代码才能确定,但假设您要添加的类都遵循相同的html结构,并且在DOM中以相同的方式彼此接近。

你可以这样做:

保留所有唯一的Id和类,但是在每个可点击的元素中添加一个相同的类(#showdescription,#showdescription等等)。调用这个类,类似于“信息容器”或任何您喜欢的东西,但只需确保将这个类添加到您希望运行单击函数的每个元素中。

现在假设每个容器的HTML结构大致相同,您可以使用如下所示的.each函数:

代码语言:javascript
复制
$('.info-container').each(function (){

});

这将针对相同的类,但单独使用内部的" This“选择器。因此,不管在这里运行什么,都将只在单击的单个类上运行,即使有多个名称相同的类。

在这里,我们现在可以将click函数作为选择器使用"this“:

代码语言:javascript
复制
$('.info-container').each(function (){
    $(this).click(function () {
        //code here
    });
});

现在,在这个单击函数中,我们需要找到要将类添加到的元素。有多种方法可以做到这一点,但我最喜欢的方法是使用.sibling和.parent方法导航DOM树。现在,确保要添加的元素具有相同的类名,这样我们就可以将它们作为目标。例如“.隐藏容器”。

代码语言:javascript
复制
$('.info-container').each(function (){
    $(this).click(function () {
        $(this).children('.hidden-container').toggleClass('hidden');
    });
});

这个部分也很重要:如果html结构对每个容器不一样,那么使用.siblings或父程序将无法工作,因为它将返回不同的结果。在这种情况下,我们不会使用兄弟姐妹,孩子或父母。相反,我们将使用.find和.closest。.find将找到与'x‘类名最近的元素,但只从DOM树下降。就像这样:

代码语言:javascript
复制
$('.info-container').each(function (){
    $(this).click(function () {
        $(this).find('.hidden-container').toggleClass('hidden');
    });
});

.Closest将沿着DOM向上移动,从simmilar到.parent。阅读Jquery手册了解差异。

代码语言:javascript
复制
$('.info-container').each(function (){
    $(this).click(function () {
        $(this).closest('.hidden-container').toggleClass('hidden');
    });
});

您还可以通过组合.sibling、.closest、.children等来上下遍历DOM。

代码语言:javascript
复制
$('.info-container').each(function () {
    $(this).click(function () {
        $(this).children('classname').siblings('classname').children('classname').addClass('newClass');
    });
});

总之,这是一个很好的方法,当使用多个项目,在理论上,做同样的事情。确保它们都具有相同的HTML智能结构。确保它们都有非唯一的类,这样您就可以将它们都作为目标,而不是单独针对它们。

希望这有帮助,请随时发电子邮件给我: work@jpwebdev.com。我是全职工作,作为完整的堆栈网页开发,但始终有时间帮助!

亲切的问候

琼恩

票数 0
EN

Stack Overflow用户

发布于 2015-12-20 17:55:58

可重用的方式而不会破坏您的方法:

代码语言:javascript
复制
var eventElements = [{
  target: '#showdescription',
  affected: ['#description_sh', '#hiddendescription']
}, {
  target: '#showrooms',
  affected: ['#rooms_sh', '#hiddenrooms']
}, {
  target: '#showmeals',
  affected: ['#meals_sh', '#hiddenmeals']
}, {
  target: '#showout',
  affected: ['#out_sh', '#hiddenout']
}, {
  target: '#showreviews',
  affected: ['#reviews_sh', '#hiddenreviews']
}];

eventElements.forEach(function (el) {
  $(el.target).on('click', function () {
    $(el.affected[0]).toggleClass("down");
    $(el.affected[1]).toggleClass("hidden");
  });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34383580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档