【问题标题】:Element with hover then click removes hover effect and click again adds hover again带有悬停然后单击的元素删除悬停效果并再次单击再次添加悬停
【发布时间】:2011-10-26 06:16:54
【问题描述】:

我正在尝试使用 JQuery 创建一个搜索词拼图框。基本上每个单元格中都有一个字母表,用户需要通过单击表格单元格来查找和标记网格中的单词。所以我试图通过以下方式组合点击和悬停事件:

当鼠标悬停时,所有单元格都应该具有悬停突出显示效果,除非它已经被单击。如果它被单击,那么它应该只是更改为不同的颜色以标记活动选择,以便删除悬停效果。再次单击选定的单元格后,它应该恢复到其原始状态,并添加了悬停突出显示效果。进一步点击只会重复上述切换。

这怎么可能?我已经使用 unbind(), bind() 选项尝试了以下操作,但没有成功。谢谢,阿提拉

$("#puzzleTable td").each(function(){
$(this).hover(
   function(){
       $(this).css("background-color", "#FF6633");
   },
   function() {
       $(this).css("background-color", "#99CC00");
   }).toggle(
       function(){
       $(this).unbind('mouseenter mouseleave'),
       $(this).css("background-color", "#006699")
       },
       function(){      
       $(this).css("background-color", "#99CC00"),              
       $(this).bind('mouseenter mouseleave')
       }
   );
});

【问题讨论】:

    标签: jquery click hover toggle mouseevent


    【解决方案1】:

    我会通过绑定两个事件来完成这一切:点击和悬停。它们中的每一个都有自己的逻辑来解决,并且将彼此独立地运行。此外,由于您要做的只是实现外观更改,因此您可以通过添加/删除 CSS 类而不是直接更新 CSS(即使用内联样式)来实现。

    这是一个小提琴:http://jsfiddle.net/VCf3E/

    示例函数(类和颜色未取自您的示例代码):

    $('table td')
        .hover(
       function(){
           $(this).addClass('hover');
       },
       function() {
           $(this).removeClass('hover');
       })
        .click(
        function() {
           $(this).toggleClass('active');
    });
    

    【讨论】:

    • forehead smack Annabelle 对悬停有正确的想法:如果只是样式更改,则无需使用 JS。如果悬停事件对其他逻辑有用,我将保持我的示例完整。
    【解决方案2】:

    您的代码在重新绑定 mouseenter 和 mouseleave 事件时未指定事件处理程序。但是,如果您使用 CSS 类来应用您的样式,则根本不必取消绑定和重新绑定鼠标事件。只需定义您的“单击”状态规则,以便它们覆盖“悬停”状态规则。这很容易,特别是如果您不需要支持 IE6(下面也包含 IE6 解决方案):

    CSS 样式:

    td {
        background-color: #99CC00;
    }
    
    td:hover {
        background-color: #FF6633;
    }
    
    td.clicked, td.clicked:hover {
        background-color: #006699;
    }
    

    Javascript:

    $("#puzzleTable td").click(function () { $(this).toggleClass('clicked'); });
    

    如果你需要支持 IE6,它会变得有点复杂(因为 IE6 只支持锚元素上的:hover):

    CSS:

    td {
        background-color: #99CC00;
    }
    
    td.hover {
        background-color: #FF6633;
    }
    
    td.clicked {
        background-color: #006699;
    }
    

    Javascript:

    var cells = $('#puzzleTable td');
    cells.bind('mouseenter mouseleave', function() { $(this).toggleClass('hover'); });
    cells.click(function() { $(this).toggleClass('clicked'); });
    

    【讨论】:

    • 如何将事件处理程序添加到上述重新绑定代码中?
    • 您可以将您的 jQuery.hover() 调用移动到一个单独的函数,然后将该函数传递给 jQuery.bind()。
    • 但实际上,如果您使用 CSS 类来控制单元格样式,则无需取消绑定/重新绑定鼠标事件。
    猜你喜欢
    • 2017-09-10
    • 2012-03-18
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    相关资源
    最近更新 更多