0

我的 CodePen: http ://codepen.io/leongaban/pen/IGcBa

我有一个包含 5 个项目的数组:

var home = {
    faqmenu : ['faq-general',
               'faq-protecting',
               'faq-search',
               'faq-incoming',
               'faq-requests']
           };


而我的标记中的简单列表菜单,我使用标签data-pane来指示单击了哪个按钮。然后在我的 jQueryfaqpane = $(this).data('pane');中,它是如何找出单击了哪个按钮的。

<li id="faq-general" data-pane="faq-general" class="faq-menu-item faq-blue">
    <span>General Questions</span>
</li>

<li id="faq-protecting" data-pane="faq-protecting" class="faq-menu-item">
    <span>Protecting Your Data</span>
</li>
...

在此处输入图像描述

我正在尝试构建一个简单的 Case Switch 功能,它将找出单击了哪个按钮,现在有了这些信息,我需要对单击的按钮以及未单击的项目执行一些操作。

对单击的按钮进行操作很容易,但是如何定位所有其他未单击的项目并更改其 CSS?

$('.faq-menu-item').click(faqMenuShow);
    function faqMenuShow(event) {

        faqpane = $(this).data('pane');
        console.log('The clicked faqpane is: '+faqpane);

        switch (faqpane) {
            case 'faq-general':

                // Do stuff on the faq-general button - easy

                jQuery.each(home.faqmenu, function(index, value) {
                    console.log(this);
                    return (this != "faq-general");
                });

                //  ^ For items that are NOT faq-general
                //  remove this class: .parent().removeClass('faq-blue');

                break;

            case 'faq-protecting':

                break;
            case 'faq-search':

                break;
            case 'faq-incoming':

                break;
            case 'faq-requests':

                break;
        }

    };


console.log(this);jQuery each函数在控制台中将其吐出: 在此处输入图像描述

您将如何查找未选择的项目并运行一些基本功能,例如删除它们的类/css?

我的 CodePen: http ://codepen.io/leongaban/pen/IGcBa

4

8 回答 8

1

如果我正确理解您的问题,您正在尝试修改所有未点击项目的CSS。因此,如果单击“faq-general”,您想修改其余的列表项。如果是这种情况,那么我认为 jQuerysiblings就是您要寻找的:

工作小提琴

 $('.faq-menu-item').on('click', function(){
  $(this).css('background', 'transparent');
  $(this).siblings().css('background', 'red');
});
于 2013-06-20T15:46:16.107 回答
1

最简单的方法是检查 id 是否不相同。

切换前的代码:

var this_id = this.id;

$('.faq-menu-item').each(function() {
  if (this.id != this_id) {
    $(this).removeClass('faq-blue');
  }
});

http://codepen.io/anon/pen/iFagh

于 2013-06-20T15:43:46.170 回答
1

工作 jsFiddle 演示

无需定义单独的数组,循环遍历 DOM 元素:

$(function () {
    $('.faq-menu-item').on('click', function (event) {
        // remove class `faq-blue` from all menu items
        $('.faq-menu-item').removeClass('faq-blue');

        // add class `faq-blue` to current element
        $(this).addClass('faq-blue');
    });
});
于 2013-06-20T15:44:26.350 回答
1

我建议对菜单系统采取更通用的方法。使用 case 语句使函数难以维护(因为每次添加新菜单时,都必须修改此函数)。

我会做几件事:

1)创建一个选择所有菜单项的变量。这样您就不会在每次点击时都重新选择它们。

 var allMenus = $(".faq-menu-item");

2)如果您有一组为每个菜单项调用的函数,请将它们视为对象的属性,如下所示:

var menuActions = { general: myFuncGeneral, protecting: myFuncProtecting};

3)以更通用的方式处理点击:

function faqMenuShow(event, allMenus) {
    //this is a string the connects to the menuActions e.g. 'general'
    var clickedMenu = $(this).id().replace('faq-',''); 

    //this removes all blue classes on everything first, then re-adds to the clicked one.
    allMenus.removeClass('faq-blue').filter(this).addClass('faq-blue');

    allMenus[clickedMenu](); //this executes the function in the allMenus object
};
于 2013-06-20T16:02:56.533 回答
0

我不知道这是否可以用 jQuery 完成,但我是一个初学者 Web 开发人员。

我认为您可以做的是将“单击”类添加到单击的元素中,然后检查所有其他不属于该类的元素并对其进行处理。

于 2013-06-20T15:36:59.157 回答
0

如何创建一个单独的函数并传递被单击的按钮,遍历数组并进行简单的条件检查

If (passedElement != arrayElement) { do css stuff here } else { // this is the button clicked, make active element

于 2013-06-20T15:39:37.970 回答
0

在单击事件处理函数中,选择所有菜单项:

$('.faq-menu-item')

然后排除被点击的那个:

.not(this);

所以,把它们加在一起,你会得到:

var notClicked = $('.faq-menu-item').not(this);

然后你只需调用你需要的 jQuery 函数,例如:

notClicked.css('color', 'red');
于 2013-06-20T15:40:27.697 回答
0

你为一件非常简单的事情做了如此复杂的事情。

只需检查是否date-pane是您想要对单击的按钮进行具体操作的操作,然后使用其兄弟姐妹对未单击的元素进行一般操作。

$('.faq-menu-item').click(function (e) {
    faqpane = $(this).data('pane');

     switch (faqpane) {
         case 'faq-general':
            //do whatever you want
            alert("FAQ general");

            break;

         case 'faq-protecting':
           //do whatever you want
           alert("FAQ Protecting");

           break;
    }

    // etc...

    var notClicked = $(this).siblings();

    //action for the not clicked elements
    notClicked.each(function(){
        $(this).css('background', '#ccc');
    });
});

活生生的例子

于 2013-06-20T15:41:37.197 回答