【问题标题】:Reenable hover after off jquery在jquery中启用悬停
【发布时间】:2013-12-20 21:49:37
【问题描述】:

我整理了一个简单的小提琴来尝试解决我想要做的事情。基本上我有一个编辑器,用户可以在上面操作不同的元素。当用户将鼠标悬停在可编辑的元素上时,通过 css 会出现方格轮廓。一旦用户单击轮廓更改为实心轮廓以指示这是现在可编辑的元素,因此我删除了单击时的悬停事件,因此如果他们在页面周围移动鼠标,则不会在其他可编辑元素周围出现方格线在页面上,基本上锁定了它们,除了被选中的那个。

如果用户决定不编辑该元素,我有一个按钮可以让他们返回并“取消”重新启用应该悬停在所有可编辑元素上。到目前为止,一旦我将其置于锁定状态,我就无法再次启用该事件。

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

$('.element').on({
    mouseover: function(){
        $(this).css({'outline':'2px dashed red'});
    },
     mouseleave: function(){
        $(this).css({background: '#CCC'});
    },
    click: function(){
        $(this).off('mouseover');
        $(this).off('mouseleave');
        $(this).css({'outline':'2px solid #369fe4'});
    }
});

$('#button').click(function(){
      $('.element').on('mouseover');
      $('.element').on('mouseleave');

});

有人可以看看,让我知道为什么我无法使用 .on 重新启用该活动

【问题讨论】:

  • 调用.on()时必须提供处理函数。
  • 不是添加和删除事件处理程序,而是添加和删除一个类,并使用事件委托将处理程序绑定到类。
  • 您也可以使用类来更改 CSS,而不是在处理程序中这样做。
  • 感谢使用 clases 更改大纲是一个简单的解决方法。但是,我不确定您所说的处理函数是什么意思,您能举个例子吗?
  • $('#button').on('click',function(){ 有一个处理函数,$('#button').on('mouseover'); 没有。

标签: jquery binding click jquery-hover


【解决方案1】:

你需要重置你想要触发on("mouseover")function

function setHover(){
    $('.element')
        .css({'outline':'none'})
        .off('mouseover mouseleave click')
        .on({
            mouseover: function(){
                $(this).css({'outline':'2px dashed red'});
            },
             mouseleave: function(){
                 $(this).css({'outline':'none', background: '#CCC'});
            },
            click: function(){
                $('.element').off('mouseover mouseleave click');
                $(this).css({'outline':'2px solid #369fe4'});
            }
        });
}

$('#button').click(function(){
   setHover();
});

setHover();

【讨论】:

  • 谢谢,但这并没有达到预期的效果。这是一个小提琴 [jsfiddle.net/ZqfTX/279/]jsfiddle.net/ZqfTX/279,当您最初将框边框悬停时变为红色/方格。单击其中一个框后,悬停会在所选框上切换为蓝色,并且应在其余框上禁用悬停效果。单击“取消编辑”按钮后,最初选择的元素将取消选择,并重新启用悬停在其他元素上。那有意义吗?提前致谢。
  • 是的,这是有道理的。让我看看我能不能弄明白。
  • 我已经更新了。您最初的问题是关于为什么您不能在事件上重新附加鼠标,原因是因为“关闭”完全删除了该处理程序功能。因此,您必须重新创建处理程序以及mouseovermouseleave。功能问题是$(this).off 而不是$('.element').off
  • 谢谢。我查看了 [jsfiddle.net/ZqfTX/279] 并没有看到更新。能否给我新的网址以便我查看?
  • 我现在明白了。谢谢!我希望我能给你买杯咖啡。:-) 非常感谢你在这方面的帮助。
【解决方案2】:

HTML:

<div class="element inactive"></div>
<br>
<div id="button"><a href="#">Cancel Editing</a></div>

JS:

$(document).on({
    mouseleave: function(){
        $(this).css({background: '#CCC'});
    },
    click: function(){
        $(this).toggleClass('inactive active');
    }
}, '.element.inactive');

$('#button').on('click',function(){
      $('.element.active').toggleClass('inactive active');    
});

CSS:

.element{
    position:absolute;
    top:60px;
    left:100px;
    background: #ccc;
    width: 200px;
    height: 120px;
}
.element.inactive:hover {
    outline: 2px dashed red;
}
.element.active {
    outline: 2px solid #369f34;
}

FIDDLE

【讨论】:

  • 感谢您的回答,但这并没有实现我想要做的事情。在我的真实世界情况下,页面上会有多个框/元素。一旦选择了其中一个元素,页面上的所有其他元素都需要锁定。这意味着一旦选择了元素,就需要禁用悬停效果。这就是为什么仅仅切换 CSS 是不够的。我需要使用 .off 关闭悬停。然后,如果要取消编辑元素,请单击一个按钮以重新绑定我刚刚禁用的所有元素的悬停事件。这有意义吗。
  • 您可以将悬停效果绑定到特定的类。当您选择其中一个元素时,您更改了其他元素的类,然后悬停效果将被禁用。如果您制作一个小提琴来展示您更一般的情况,我可以向您展示。
  • 我把你要求的小提琴放在一起。您认为您可以看一下并告诉我如何解决此问题吗? jsfiddle.net/ZqfTX/273 提前致谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多