【问题标题】:Jquery: Small bind hover/unbind snippet of code, few lines long, don't know what's wrongJquery:小绑定悬停/取消绑定代码片段,几行长,不知道出了什么问题
【发布时间】:2010-09-20 13:41:35
【问题描述】:

我创建了 DIV.cb-toggle,当用户将鼠标悬停在此 div 上时,它会变为橙色,当他们将鼠标悬停在此 div 之外时,它会变为灰色,当用户单击此 div 时,它会变为灰色蓝色,告诉用户它已被选中。所以当它没有被选中时,它有 mouseenter mouseleave 动画,但是当它被选中时我想取消绑定这些事件,我不希望悬停事件在它被选中时起作用,只有在它没有被选中时才起作用。做我想要完成的事情的最佳方法是什么?我想出了下面的代码,但我很确定这是一种可怕的方法,我不知道该怎么做。非常感谢您的帮助。

我的代码:

$('.cb-toggle').toggle(function() { 
      $(this).animate({"background":"blue", "color":"#fff;"});      
      $(".cb-toggle").unbind("click.myfadee");
   }, function() {
      $(this).animate({"background":"gray", "color":"#fff;"});
      $('.cb-toggle').trigger('mouseenter');
   });
});

我称之为绑定:

$(".cb-toggle").bind("click.myfadee", function(){
      $(".cb-toggle").mouseenter(function() {
      $(this).animate({"background":"orange", "color":"#fff;"});
   }).mouseleave(function() {
      $(this).animate({"background":"gray", "color":"#fff;"});
   });
});

我需要保留背景颜色动画,它需要褪色。

【问题讨论】:

  • 为什么解绑,变得复杂了?如果您的点击功能是将“选定”类添加到您的 div,则您可以更改鼠标进入/离开功能以检查该类,如果存在则不更改颜色。
  • 代码是正确的,所以认为你必须在jsfiddle.net 上更新一点,这样每个人都可以看到有什么问题
  • 我不小心把有.css(etc)的代码贴出来了,应该是.animate(etc),bg颜色需要动画

标签: javascript jquery hover bind unbind


【解决方案1】:

我会使用 CSS 作为样式来简化您的整个设置,而无需取消/重新绑定,如下所示:

.cb-toggle { background: blue; color: #fff; }
.cb-toggle.active { background: gray; }
.cb-toggle.active:hover { background: orange; }

那么你可以这样做:

$('.cb-toggle').click(function() {
  $(this).toggleClass("active");
});

这种方法还可以让您将所有样式、颜色等卸载到 CSS 中,这意味着当您决定调整颜色或任何其他样式时不需要更改 JavaScript :)


或者,如果您需要支持 IE6,请为悬停添加一个 .live() 处理程序,该处理程序仅触发具有 .active 类的悬停,如下所示:

$(".cb-toggle.active").live('mouseenter', function() {
  $(this).addClass('hover');
}).live('mouseleave', function() {
  $(this).removeClass('hover');
});

使用匹配的 CSS:

.cb-toggle.active.hover { background: orange; }

【讨论】:

  • +1 用于使用 live(),尽管您还应该查看 delegate() 的文档
  • 废话我发布了错误的代码..我需要背景在颜色之间设置动画..这样就行不通了。代码已更新。
  • @android.nick - 你是在使用颜色插件还是 jQuery UI 来制作颜色动画?我很快就出去了,但是 jQuery UI 也可以让你为类设置动画。
【解决方案2】:

您可能应该只使用选定的类。此外,我建议不要使用您在此处使用的任何 .css() 调用。只需使用类。

$(".cb-toggle").bind("click.myfadee", function(){
  $(this).toggleClass('selected');
});

$('.cb-toggle').toggle(function() {
  var $this = $(this);
  if ( $this.is('.selected') ) {
    $this.css({"background":"blue", "color":"#fff;"});      
  }
}, function() {
  var $this = $(this);
  if ( $this.is('.selected') ) {
    $this.css({"background":"gray", "color":"#fff;"});
  }
});

【讨论】:

  • 我发布了包含 .css() 的错误代码,它应该是 .animate(),我将如何修改您的代码来修复它? grrr对不起,我太累了。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多