添加/删除类时 jQuery 单击功能表现得很奇怪

发布于 2024-12-29 18:35:58 字数 892 浏览 5 评论 0原文

我有两个列表项,单击它们时,应将类从“.off”更改为“.on”。一次只能有一个元素为“.on”,因此当一个元素已打开并且单击另一个元素时,两个元素都应将类从“.off”更改为“.on”,反之亦然。如果单击类为“.on”的列表项,它应该将类更改为“.off”

我遇到的问题是,当单击类为“.on”的列表项时,它仍然运行单击函数,就好像它一样有一个“.off”类

我的 html:

<ul>
    <li><a href="about" class="off">ABOUT</a></li>
    <li><a href="upload" class="off">SUBMIT</a></li>
</ul>

我的 javascript(在 jQuery 1.7.1 上运行)

$('.off').click(function(event) {
    event.preventDefault();
    $(".on").addClass("off").removeClass("on");
    $(this).addClass("on").removeClass("off");
});
$('.on').click(function(event) {
    event.preventDefault();
    $(this).addClass("off").removeClass("on");
});

有谁知道这里发生了什么?我的代码有问题还是我在这里遇到了某种错误?

http://jsfiddle.net/ZC3CW/6/

I have two list items that, when clicked, should change classes from '.off' to '.on'. Only one element should be '.on' at a time so when one is already turned on and the other is clicked both elements should change classes from '.off' to '.on' and vice versa. If a list item with a class of '.on' is clicked it should change classes to '.off'

The problem I am having is when a list item with class '.on' is clicked it still runs the click function as if it had a class of '.off'

My html:

<ul>
    <li><a href="about" class="off">ABOUT</a></li>
    <li><a href="upload" class="off">SUBMIT</a></li>
</ul>

My javascript (running on jQuery 1.7.1)

$('.off').click(function(event) {
    event.preventDefault();
    $(".on").addClass("off").removeClass("on");
    $(this).addClass("on").removeClass("off");
});
$('.on').click(function(event) {
    event.preventDefault();
    $(this).addClass("off").removeClass("on");
});

Does anyone know what is going on here? Is there something wrong in my code or have I encountered some sort of bug here?

http://jsfiddle.net/ZC3CW/6/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

丘比特射中我 2025-01-05 18:35:58

您使用 click() 绑定事件的选择器用于选择要添加事件处理程序的元素。运行处理程序时不考虑选择器。

您应该寻找更像这样的东西:

$('li').click(function(event) {
    event.preventDefault();

    if ($(this).hasClass('off')) {
        $(".on").addClass("off").removeClass("on");
        $(this).addClass("on").removeClass("off");
    } else { // $(this).hasClass('on');
        $(this).addClass("off").removeClass("on");
    }
});

您可能希望通过向 ulli 添加类/id 来使 li 选择器更加明确代码>的。

为了进一步混淆事情,你也可以这样做(如果你使用的是 jQuery > 1.7);

$(document).on('click', '.off', function(event) {
    event.preventDefault();
    $(".on").addClass("off").removeClass("on");
    $(this).addClass("on").removeClass("off");
});
$(document).on('click', '.on', function(event) {
    event.preventDefault();
    $(this).addClass("off").removeClass("on");
});

这是因为 .on() 函数的工作原理是将事件处理程序附加到所选元素 (document),并且只会在事件上执行处理程序(函数)如果事件源自的元素与选择器 .off 在事件触发时(而不是在绑定时)匹配,则指定(click)。

The selectors you're using to bind the event using click() are used to select the elements to add the event handler to. The selector is not considered when the handler is run.

You should be looking for something more like this:

$('li').click(function(event) {
    event.preventDefault();

    if ($(this).hasClass('off')) {
        $(".on").addClass("off").removeClass("on");
        $(this).addClass("on").removeClass("off");
    } else { // $(this).hasClass('on');
        $(this).addClass("off").removeClass("on");
    }
});

You might want to make the li selector more explicit by adding a class/id to the ul or li's.

To confuse things further, you could also do this (if you're using jQuery > 1.7);

$(document).on('click', '.off', function(event) {
    event.preventDefault();
    $(".on").addClass("off").removeClass("on");
    $(this).addClass("on").removeClass("off");
});
$(document).on('click', '.on', function(event) {
    event.preventDefault();
    $(this).addClass("off").removeClass("on");
});

This is because the .on() function works by attaching the event handler to the selected elements (document), and will only execute the handler (the function) on the event specified (click) if the element that the event originated from matches the selector .off at the time the event fired, not at binding time.

宫墨修音 2025-01-05 18:35:58

我建议向不同的选择器添加一个点击句柄,这应该适合你......

$("ul li a").click(function(e){
   e.preventDefault();

   if($(this).hasClass("off")){
      $("ul li a").addClass("off").removeClass("on");
      $(this).addClass("on").removeClass("off");
   }
   else{
      $(this).addClass("off").removeClass("on");
   }
});

I would suggest adding a click handle to a different selector, this should work for you...

$("ul li a").click(function(e){
   e.preventDefault();

   if($(this).hasClass("off")){
      $("ul li a").addClass("off").removeClass("on");
      $(this).addClass("on").removeClass("off");
   }
   else{
      $(this).addClass("off").removeClass("on");
   }
});
七色彩虹 2025-01-05 18:35:58

问题是 jQuery 处理程序在页面加载时附加,并且无论更改其类如何都保持不变。使用 live('click', handler) on('click', handler) 而不是 click()。

编辑:刚刚注意到 .live() 在 jQuery 1.7 中已被弃用。

The problem is that jQuery handlers get attached at page load and remain the same regardless of changing their classes. Use live('click', handler) on('click', handler) instead of click().

Edit: just noticed that .live() is deprecated in jQuery 1.7.

新一帅帅 2025-01-05 18:35:58

我看到的问题是,您的“on”类在单击事件发生时并未运行,因此您的 $('.on').click 方法永远不会被调用。

尝试在更改班级后重新分配您的活动(示例如下):

var assignClicks = function () {
    $('.off').click(function(event) {
        event.preventDefault();
        $(".on").addClass("off").removeClass("on");
        $(this).addClass("on").removeClass("off");
        assignClicks();
    });
    $('.on').click(function(event) {
        event.preventDefault();
        $(this).addClass("off").removeClass("on");
        assignClicks();
    });
};
assignClicks();

希望这有帮助,

皮特

The problem as I see it is that your "on" class is not in play at the time of the click event, so your $('.on').click method is never being called.

Try re-assigning your events after changing classes (example follows) :

var assignClicks = function () {
    $('.off').click(function(event) {
        event.preventDefault();
        $(".on").addClass("off").removeClass("on");
        $(this).addClass("on").removeClass("off");
        assignClicks();
    });
    $('.on').click(function(event) {
        event.preventDefault();
        $(this).addClass("off").removeClass("on");
        assignClicks();
    });
};
assignClicks();

Hope this helps,

Pete

ζ澈沫 2025-01-05 18:35:58

单击绑定到元素而不是类。
也许您可以将事件附加到

  • 元素并检测/切换元素类:

    $('li').click(函数(事件) {
        event.preventDefault();
        if( $(this).hasClass('on') ) {
            $(this).removeClass('on');
        }
        别的 {
            $(this).addClass('on');
            $(this).siblings().removeClass('on');
        }
    });
    
  • The click is bound to the element not the class.
    Maybe you can attach the events to the

  • elements and detect/toggle the elements classes:

    $('li').click(function(event) {
        event.preventDefault();
        if( $(this).hasClass('on') ) {
            $(this).removeClass('on');
        }
        else {
            $(this).addClass('on');
            $(this).siblings().removeClass('on');
        }
    });
    
  • ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文